Skip to content

Latest commit

 

History

History
563 lines (390 loc) · 8.54 KB

File metadata and controls

563 lines (390 loc) · 8.54 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0132
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在: 

     个人网站: `https://oeasy.org` 
     蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
     GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
     Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

字典类型

回忆

  • 上次 研究了
    • dictionay 的 词根和同义词

图片描述

  • 如何操作字典项呢?🤔

回忆

  • 先回忆 列表
l = ["zero", "one"]
l
l[0]
l[1]
  • 可以 数字 索引到 列表项

图片描述

  • 字典中的 key
    • 也可以是数字吗?

字典

  • 用整形数字作为key
d = {0: "zero", 1: "one"}
d
d[0]
d[1]
  • 尝试

图片描述

  • 看起来这个时候
    • 字典就相当于一个列表?

数据类型的意义

  • 观察类型
type(l)
type(d)
  • l 是
    • 列表类的对象
    • 使用 list类的 方法

图片描述

  • d是
    • 字典类的对象
    • 使用 字典类(dict)的方法

图片描述

  • 变量类型 不一样
    • 方法也不一样

颜色

  • 比如我 想建立一个 终端颜色字典
    • 我们 只能记住 颜色名字
      • red
      • blue
      • green
    • 但是记不住颜色的编号
colors = {
	"red": "\x1b[31m",
	"reset": "\x1b[0m",
}
colors
  • 收录两种颜色
    • 一个红色 \33[31m
    • 一个还原色 \33[0m

图片描述

  • 这个东西怎么用呢?

使用字典

colors["red"]
colors["reset"]
print(colors["red"])
print("red!red!red!")
  • 后面的文字 全都染红 了

图片描述

  • 想把颜色恢复

颜色复位

print(colors["reset"])
  • 颜色复位了

图片描述

控制颜色输出范围

  • 要求
    • 只有 [error]变红
      • 前面 加colors["red"]
      • 后面 加colors["reset"]
      • 相当于 选中[error]
print(colors["red"], "[red]", colors["reset"], "oeasy")
  • 通过 key 来找到 value
    • 这是 映射(map)关系
    • 通过 key 键
    • 得到 value 值
  • 这样不用记颜色数值号了!
    • 靠的是什么?

图片描述

  • 靠的 就是 key-value 之间的
    • 映射 (mapping)
  • 想给 颜色字典 加个绿色
    • 怎么办?🤔

增加字典项

  • 如果 字典中没有green 这个 key 的话
    • 就给 字典 加上 green
      • 增加 green 这个键(key)
      • 以及\33[32m 这个值(value)
colors["green"] = "\x1b[32m"
colors
  • 先添加绿色

图片描述

  • 再使用绿色
print(colors["green"], "[green]", colors["reset"], "oeasy")
  • 效果

图片描述

  • 如果
    • 已经有green了
    • 我想要修改呢?

修改字典项

  • 如果 green 这个key
    • 在字典里 已经有了
  • 就 对于green 这个key 对应的的value
    • 进行修改
colors["green"] = "\x1b[42m"
colors
  • 把 黑底绿字\x1b[32m
    • 变成了 绿底白字\x1b[42m
print(colors["green"], "[green]", colors["reset"], "oeasy")
  • 效果

图片描述

  • 可以用update方法
    • 更新 字典 吗?

更新字典项

  • 虽说先删除再添加也能更新
colors = {
	"red": "\x1b[31m",
	"green": "\x1b[32m",
	"reset": "\x1b[0m",
}
print(colors["red"], "[red]", colors["reset"], "oeasy")
colors.update(red="\x1b[41m")
print(colors["red"], "[red]", colors["reset"], "oeasy")
  • 试试这个 update

图片描述

  • 字典项的 增删改
    • 都是通过 key索引到 字典项
  • 如果 我想
    • 删除 这个字典项 呢?

删除字典项

  • 可以 直接del 删除
del colors["green"]
  • 有点像 del删除
    • 列表 索引的元素

图片描述

  • 还有啥 删除的方法吗?

pop

lst = list(range(6))
lst
  • 先回忆 list.pop

图片描述

  • 从 栈顶 弹栈
lst.pop()
lst
  • 弹出最后一个

图片描述

  • 弹出 指定列表项
lst.pop(2)
  • 从列表中删除 并 返回列表项

图片描述

  • 如果列表项不存在呢?
lst.pop(100)
lst
  • 报索引错误

图片描述

  • 再来看 字典

pop

d = {	
	"cat": "miao",
	"dog": "wang"
}
  • 用pop方法 删除key
d
d.pop("cat")
d
d.pop("dog")
d
  • 在字典里面找key
    • 找到了就删除
    • 返回value

图片描述

  • pop方法 没有找到key 呢?

pop

help(dict.pop)
  • 弹栈

图片描述

没有找到

d
d.pop("rat")
  • 没有找到
    • 抛出异常

图片描述

  • 除非 有第二个参数
d.pop("rat", "notfound")
  • 有第二个参数的话
    • 就返回 第二个参数

图片描述

  • dict.pop和list.pop
    • 有啥区别吗?

两种类型的 pop

特点 list.pop() dict.pop()
参数 索引 index 键 key
无参数 删最后一个 报错
返回值 被删元素 被删键 对应的值
不存在 报错 报错 / 或设默认值不报错
  • 时间复杂度 如何?

时间复杂度

图片描述

  • dict.pop 时间复杂度为O(1)
    • list.pop(i) 时间复杂度 O(n)
    • 字典删除效率更高
    • 不过需要空间更大
d.pop()
  • 不支持 无参数 弹栈

图片描述

  • 想要 无参弹栈 怎么办?

求助

  • 不用参数 的 popitem
help(dict.popitem)
  • 字典 非空
    • 弹出最后一个

图片描述

  • 后入字典的 先弹出
    • 由此可见 字典 是 有顺序的

字典的顺序

d = {	
	"cat": "miao"
}
d["dog"] = "wang"

d2 = {
	"dog": "wang"
}
d2["cat"] = "miao"

d
d2
  • 这两个字典不一样

图片描述

弹栈

  • pop the stack
    • 弹栈

图片描述

  • FILO
    • First In Last Out
    • 后入先出

实践

d = {	
	"cat": "miao"
}
d["dog"] = "wang"
d
  • 先弹出 后面的dog
    • 再弹出 前面的cat
d.popitem()
d
d.popitem()
d
d.popitem()
d
  • 弹到 字典空了
    • 直接抛出异常

图片描述

  • 字典可以拷贝吗?

基础拷贝

colors = {
	"red": "f00",
	"blue": "0f0",
}
colors2 = colors

图片描述

  • =是直接 赋字典地址
    • 两个字典指向相同位置

copy

colors = {
	"red": "f00",
	"blue": "0f0",
}
colors2 = colors.copy()
  • 拷贝是复制出一个字典

图片描述

  • 但是拷贝是浅拷贝
    • shallow copy

浅拷贝

  • 字典某个键的值 是
    • 一个列表时
    • 浅拷贝只能拷贝列表地址
colors = {
	"red": ["f00","ff0000"],
	"blue": "0f0",
}
colors2 = colors.copy()
  • 两个新字典中"red"对应的值是同一个列表 list

图片描述

  • 换成深拷贝

深拷贝

  • 深拷贝深拷贝
    • 深层次的拷贝
from copy import deepcopy
colors = {
    "red": ["f00","ff0000"],
    "blue": "0f0",
}
colors2 = deepcopy(colors)
  • 彻底分配了 新空间

图片描述

  • 这就是字典的
    • 复制和修订

总结

  • 这次学习了字典
    • 字典可以读取和赋值
      • 键的列表 keys()
      • 值的列表 values()
      • 字典项的列表 items()
    • 字典项可以增删改
      • 直接 用key 索引
      • del 删除字典项
      • update函数

图片描述

  • 可以用 字典 更新字典 吗??🤔
  • 下次再说!👋🏻

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。