字典——增
fromkeys():创建一个新字典 update():更新字典 copy():复制字典
new_dict = dict.fromkeys(['a', 'b', 'c'], 0)print(f"初始化字典:{new_dict}")for key in new_dict.keys():new_dict[key] += 1print(new_dict)"""初始化字典:{'a': 0, 'b': 0, 'c': 0}{'a': 1, 'b': 1, 'c': 1}"""
字典——删
popitem():返回并删除字典中的最后一对键和值(元组),为空会报错 pop():给定key,返回被删除值 clear():清除字典
new_dict = {'a': 1, 'b': 1, 'c': 1}print(new_dict.popitem())print(type(new_dict.popitem()))"""('c', 1)<class 'tuple'>"""
字典——改
dict[“a”]=”values”
字典——查
key in dict:检查key是否在字典 items():以列表返回可遍历的(键、值)元组数组 keys():返回一个迭代器,可以list()转换为列表 values():返回一个迭代器,可以list()转换为列表 get():返回指定的值,不存在则返回默认 setdefault(key, default=None):返回指定的值,不存在则返回默认 len(dict):返回字典dict中的项数 list(dict): 返回字典dict中使用的所有键的列表
dict_info2 = {3: 'd', 4: 'e'}print("检查key是否在字典:", 1 in dict_info)print("items以列表返回可遍历的(键、值)元组数组:", dict_info.items())print("keys返回一个迭代器,可以list()转换为列表:", dict_info.keys())print("values返回一个迭代器,可以list()转换为列表:", dict_info.values())print("get返回指定的值,不存在则返回默认:", dict_info.get(3, 'c'))print("setdefault返回指定的值,不存在则返回默认:", dict_info.setdefault(3, 'c'))dict_info.update(dict_info2)print("更新字典:", dict_info)dict_copy = dict_info.copy()print("复制字典:", dict_copy)print("创建一个新字典:", dict.fromkeys(tuple_info, 100))print("随机返回并删除字典最后一键值对", dict_info.popitem(), dict_info)print("给定key,返回被删除值:", dict_info.pop(1), dict_info)dict_info.clear()print("清除字典:", dict_info)------------------------------#检查key是否在字典: True#items以列表返回可遍历的(键、值)元组数组: dict_items([(1, 'a'), (2, 'b')])#keys返回一个迭代器,可以list()转换为列表: dict_keys([1, 2])#values返回一个迭代器,可以list()转换为列表: dict_values(['a', 'b'])#get返回指定的值,不存在则返回默认: c#setdefault返回指定的值,不存在则返回默认: c#更新字典: {1: 'a', 2: 'b', 3: 'd', 4: 'e'}#复制字典: {1: 'a', 2: 'b', 3: 'd', 4: 'e'}#创建一个新字典: {1: 100, 2: 100, 3: 100, 4: 100}#随机返回并删除字典最后一键值对 (4, 'e') {1: 'a', 2: 'b', 3: 'd'}#给定key,返回被删除值: a {2: 'b', 3: 'd'}#清除字典: {}
合并字典的各种姿势
a = {"name": "zaygee", "age": 18}b = {"name2": "hoan", "age2": 20}# updatea.update(b)print(a)# {'name2': 'hoan', 'age': 18, 'age2': 20, 'name': 'zaygee'}# 解包print({**a, **b})# {'name': 'zaygee', 'age': 18, 'name2': 'hoan', 'age2': 20}# itertoolsimport itertoolsprint(dict(itertools.chain(a.items(),b.items())))# {'name': 'zaygee', 'age': 18, 'name2': 'hoan', 'age2': 20}# collection.ChainMap# tips: 使用 ChainMap 有一点需要注意,当字典间有重复的键时,只会取第一个值,排在后面的键值并不会更新掉前面的from collections import ChainMapprint(dict(ChainMap(a, b)))# {'name': 'zaygee', 'age': 18, 'name2': 'hoan', 'age2': 20}# dict.items()print(dict(a.items() | b.items()))# {'name': 'zaygee', 'name2': 'hoan', 'age2': 20, 'age': 18}# 字典解析式print({k: v for i in [a, b] for k, v in i.items()})# {'name': 'zaygee', 'age': 18, 'name2': 'hoan', 'age2': 20}
实现字典的多级排序
- 使用sort:
 .sort(key=lambda x: (x[“age”], -x[“score])) - 使用sorted:sorted(
 , key=lambda x: (x[“age”], -x[“score]))) 
students = [{"name": "zaygee", "age": 15, "score": 90},{"name": "hoan", "age": 15, "score": 80},{"name": "john", "age": 16, "score": 80}]# 使用sort先按年纪正序排序再按分数倒序排序students.sort(key=lambda student : (student["age"], -student["score"]))print("先按年纪正序排序再按分数倒序排序: \n", students)# 先按年纪正序排序再按分数倒序排序:# [{'name': 'zaygee', 'age': 15, 'score': 90}, {'name': 'hoan', 'age': 15, 'score': 80}, {'name': 'john', 'age': 16, 'score': 80}]# 使用sortedresult = sorted(students, key=lambda student : (student["age"], -student["score"]))print(result)# [{'name': 'zaygee', 'age': 15, 'score': 90}, {'name': 'hoan', 'age': 15, 'score': 80}, {'name': 'john', 'age': 16, 'score': 80}]
字典实现计算斐波那契数列
class UserDict(dict):def __init__(self):self[0] = self[1] = 1def __missing__(self, key):fib_key = self[key] = self[key - 1] + self[key - 2]return fib_keyfib_dict = UserDict()print(fib_dict[10])# print(fib_dict[500]) # RecursionError: maximum recursion depth exceeded 超过递归深度fib_dict2 = UserDict()for i in range(2000):print(i)# 利用字典是可变参数的特性(有记忆的),此方法调用,不会出现递归问题_ = fib_dict2[i]print(fib_dict2[2000])
munch实现字典的点式操作
"""实现dict的点式操作,并继承字典的所有操作"""from munch import Munch, DefaultMunch, DefaultFactoryMunch# profile = Munch()# 使用DefaultMunch() 当访问不存在的key时不会直接报错,可设置默认值,不设置则为None# profile = DefaultMunch()profile = DefaultMunch("default", {"age": 10})print(isinstance(profile, dict)) # Trueprofile.name = "zaygee"print(profile.name)print(profile.values())print(profile.items())print(profile.keys())# 访问不存在的key,返回默认值defaultprint(profile.sex)# 自动创建key工厂方法,当key不存在时,新增该key并设置其为默认值profile = DefaultFactoryMunch(str, age=10)print(profile.name) # 输出为空print(profile.items()) # dict_items([('age', 10), ('name', '')])
有序的字典
"""有序的字典OrderedDict"""from collections import OrderedDictd = OrderedDict(name='zaygee', age=10)print(d)d['a'] = 1print(d['a'])# d= OrderedDict([('name', 'zaygee'), ('age', 10), ('a', 1)])print("d=", d)e = OrderedDict(age=10, name='zaygee')e['a'] = 1print(e['a'])# e= OrderedDict([('age', 10), ('name', 'zaygee'), ('a', 1)])print("e= ", e)# 字典顺序不一致,判断两个字典是否相等时视为Falseprint('e == d', e == d) # e == d False
自定义字典
继承collections.abc 抽象基类:它们可用于判断一个具体类是否具有某一特定的接口:例如是否可哈希,是否为映射类 MutableMapping: 支持创建映射后管理映射内容的方法 抽象方法:getitem, setitem, delitem, iter, len
"""自定义字典继承collections.abc 抽象基类:它们可用于判断一个具体类是否具有某一特定的接口:例如是否可哈希,是否为映射类MutableMapping: 支持创建映射后管理映射内容的方法抽象方法:__getitem__, __setitem__, __delitem__, __iter__, __len__"""from collections.abc import MutableMappingfrom collections import defaultdictclass CustomizeDict(MutableMapping):def __init__(self):# 当某个key不存在时,默认为0self.data = defaultdict(int)def __getitem__(self, key):print(f"调用__getitem__ 根据 {key} 获取值")return self.data[key]def __setitem__(self, key, value):print(f"调用 __setitem__ 设置 {key} 的值为 {value}")self.data[key] = valuedef __delitem__(self, key):print(f"调用 __delitem__ 删除 {key}")def __iter__(self):return iter(self.data)def __len__(self):return len(self.data)a = CustomizeDict()# 调用__getitem__ 根据 a 获取值# 0print(a['a'])# 调用 __setitem__ 设置 a 的值为 1# 调用__getitem__ 根据 a 获取值a['a'] = 1# 调用 __delitem__ 删除 aa.popitem()
