字典——增
fromkeys():创建一个新字典 update():更新字典 copy():复制字典
new_dict = dict.fromkeys(['a', 'b', 'c'], 0)
print(f"初始化字典:{new_dict}")
for key in new_dict.keys():
new_dict[key] += 1
print(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}
# update
a.update(b)
print(a)
# {'name2': 'hoan', 'age': 18, 'age2': 20, 'name': 'zaygee'}
# 解包
print({**a, **b})
# {'name': 'zaygee', 'age': 18, 'name2': 'hoan', 'age2': 20}
# itertools
import itertools
print(
dict(
itertools.chain(
a.items(),
b.items()
)
)
)
# {'name': 'zaygee', 'age': 18, 'name2': 'hoan', 'age2': 20}
# collection.ChainMap
# tips: 使用 ChainMap 有一点需要注意,当字典间有重复的键时,只会取第一个值,排在后面的键值并不会更新掉前面的
from collections import ChainMap
print(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}]
# 使用sorted
result = 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] = 1
def __missing__(self, key):
fib_key = self[key] = self[key - 1] + self[key - 2]
return fib_key
fib_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)) # True
profile.name = "zaygee"
print(profile.name)
print(profile.values())
print(profile.items())
print(profile.keys())
# 访问不存在的key,返回默认值default
print(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 OrderedDict
d = OrderedDict(name='zaygee', age=10)
print(d)
d['a'] = 1
print(d['a'])
# d= OrderedDict([('name', 'zaygee'), ('age', 10), ('a', 1)])
print("d=", d)
e = OrderedDict(age=10, name='zaygee')
e['a'] = 1
print(e['a'])
# e= OrderedDict([('age', 10), ('name', 'zaygee'), ('a', 1)])
print("e= ", e)
# 字典顺序不一致,判断两个字典是否相等时视为False
print('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 MutableMapping
from collections import defaultdict
class CustomizeDict(MutableMapping):
def __init__(self):
# 当某个key不存在时,默认为0
self.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] = value
def __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 获取值
# 0
print(a['a'])
# 调用 __setitem__ 设置 a 的值为 1
# 调用__getitem__ 根据 a 获取值
a['a'] = 1
# 调用 __delitem__ 删除 a
a.popitem()