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]
- 只有 [error]变红
print(colors["red"], "[red]", colors["reset"], "oeasy")
- 通过 key 来找到 value
- 这是 映射(map)关系
- 通过 key 键
- 得到 value 值
- 这样不用记颜色数值号了!
- 靠的是什么?
- 靠的 就是 key-value 之间的
- 映射 (mapping)
- 想给 颜色字典 加个绿色
- 怎么办?🤔
- 如果 字典中没有green 这个 key 的话
- 就给 字典 加上 green
- 增加 green 这个键(key)
- 以及\33[32m 这个值(value)
- 就给 字典 加上 green
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删除
- 列表 索引的元素
- 还有啥 删除的方法吗?
lst = list(range(6))
lst
- 先回忆 list.pop
- 从 栈顶 弹栈
lst.pop()
lst
- 弹出最后一个
- 弹出 指定列表项
lst.pop(2)
- 从列表中删除 并 返回列表项
- 如果列表项不存在呢?
lst.pop(100)
lst
- 报索引错误
- 再来看 字典
d = {
"cat": "miao",
"dog": "wang"
}
- 用pop方法 删除key
d
d.pop("cat")
d
d.pop("dog")
d
- 在字典里面找key
- 找到了就删除
- 返回value
- pop方法 没有找到key 呢?
help(dict.pop)
- 弹栈
d
d.pop("rat")
- 没有找到
- 抛出异常
- 除非 有第二个参数
d.pop("rat", "notfound")
- 有第二个参数的话
- 就返回 第二个参数
- dict.pop和list.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
- =是直接 赋字典地址
- 两个字典指向相同位置
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 即可。
































