Python 中 dict 的基本用法
1. dict 基本方法
dict: 存在键值对而且每个键值对是无序的,其中 key 是不可修改的,value 是可以改变的。故 list 和 dict 不能作为列表的 key。
1.1 增
copy(self)
fromkeys(*args, **kwargs)
例子:
1.2 删
clear(self)
pop(self, k, d=None)
popitem(self)
例子:
1.3 改
setdefault(self, *args, **kwargs)
update(self, E=None, **F)
例子:
1.4 查
keys(self)
values(self)
items(self)
get(self, *args, **kwargs)
这几个是 dict 中最重要的
例子:
2. dict 索引
info = {
"d1": "d1",
"d2": "d2",
("89", 12,): "d3",
True: "d4",
"info":
[
"information",
12,
("89", 12,),
["mate", 65],
{
"name": "Y",
"age": [18, "18"],
"k2": "v2",
"k3": "v3",
"k4": "v4"
}
],
"comment": True
}
3. dict 合并
这里有几种方法
from copy import deepcopy
import itertools
from collections import ChainMap
def line():
print("--------------------------------------------------------")
def lineln():
print("--------------------------------------------------------\n")
if __name__ == '__main__':
'''第一种方法: 最普通的方法'''
print("第一种方法: 最普通的方法")
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# dict_2 追加给 dict_1,dict_1 改变
dict_1.update(dict_2)
print(dict_1)
print(dict_2)
line()
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# dict_1 深拷贝 new_dict,dict_1 不改变
new_dict = deepcopy(dict_1)
new_dict.update(dict_2)
print(new_dict)
print(dict_1)
print(dict_2)
lineln()
'''第二种方法: 先解包再合并字典'''
print("第二种方法: 先解包再合并字典")
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# 先解包再合并字典
new_dict_1 = {**dict_1, **dict_2}
print(new_dict_1)
line()
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
# dict_2 = {"class": "初一", "sex": "男"}
dict_2 = {"class": "初一"}
# 这种方法不能有一样的 key, 否则会报错
new_dict_2 = dict(**dict_1, **dict_2)
print(new_dict_2)
lineln()
'''第三种方法: 借助 itertools'''
print("第三种方法: 借助 itertools")
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# 通过迭代后转化为字典类型
new_dict = dict(itertools.chain(dict_1.items(), dict_2.items()))
print(new_dict)
lineln()
'''第四种方法: 借助 ChainMap'''
print("第四种方法: 借助 ChainMap")
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# ChainMap 和 itertools 原理一样,通过迭代. 从结果可以看出, 先迭代 dict_1, 后迭代 dict_2, 所以结果看起来 sex 被覆盖
new_dict = dict(ChainMap(dict_1, dict_2))
print(new_dict)
lineln()
'''第五种方法: 使用 dict.items() 合并'''
print("第五种方法: 使用 dict.items() 合并")
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# 先利用 items 方法将 dict 转成 dict_items, 再对其取并集转化为 dict 即可, 相同的 key 随机
new_dict = dict(dict_1.items() | dict_2.items())
print(new_dict)
line()
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# 先利用 items 方法将 dict 转成 dict_items, 再使用 list 函数合并, 相同的 key 会被后面的覆盖
new_dict = dict(list(dict_1.items()) + list(dict_2.items()))
print(new_dict)
lineln()
'''第六种方法: '''
print("第六种方法: 使用 dict.items() 合并")
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# 烧脑表达式
new_dict = {k: v for d in [dict_1, dict_2] for k, v in d.items()}
print(new_dict)
lineln()
'''第七种方法: Python 3.9 新特性'''
print("第七种方法: Python 3.9 新特性")
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# 先利用 items 方法将 dict 转成 dict_items, 再对其取并集转化为 dict 即可, 相同的 key 随机
new_dict = dict_1 | dict_2
print(new_dict)
line()
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# 原地更新
dict_1 |= dict_2
print(dict_1)
line()
# 两个字典
dict_1 = {"name": "小红", "age": 14, "sex": "女"}
dict_2 = {"class": "初一", "sex": "男"}
# 原地更新
dict_2 |= dict_1
print(dict_2)
# 原地更新
lineln()
参考网址:
[1]: https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/105570507