一、 字典的现代用法
1.1 字典推导式
students = [
(18, '张三'),
(21, '李四'),
(25, '王五')
]
dic = {name : age for age, name in students}
print(dic)
1.2 映射合并(Python3.9)
d1 = {'a': 10, 'b': 20, 'c': 30}
d2 = {'c': 40, 'd': 50}
d3 = d1 | d2
print(d3)
print(id(d1))
print(id(d2))
print(id(d3))
d1 |= d2
print(d1)
print(id(d1))
print(id(d2))
print(id(d3))
1.3 插入或更新可变的值
d1 = {'a': [20]}
print(d1.setdefault('a'))
print(d1)
print(d1.setdefault('b'))
print(d1)
print(d1.setdefault('c', [500]))
print(d1)
使用模式匹配处理映射
def get_create(record:dict) -> list:
match record:
case {'type':'student', 'author':[*names]}:
print("names:", names)
case {'type': 'student', 'author': name}:
print("name:", name)
case _:
print("没有匹配到内容")
d1 = {'type':'student', 'author':(1, 2, 3)}
d2 = {'type':'student', 'author': 'th'}
d3 = {'type':'student'}
d4 = {'type':'stu', 'author':5}
get_create(d1)
get_create(d2)
get_create(d3)
get_create(d4)
'可哈希’的定义
1. 一个对象的哈希吗在整个生命周期内永不发生改变(依托__hash__),而且可与其他对象比较(__eq__),这个对象就是可哈希的
2. 两个可哈希对象仅当哈希码相同时相等
3. 数值类型和扁平类型(str、bytes)是可哈希的
4. 如果容器类型不可变,且容器类型里面的数据都是可哈希的,该容器也是可哈希的
5. 用户自定义的类型是可哈希的,因为自定义类型的哈希码取自id()
6. 如果要修改__eq__和__hash__,需要考虑是在生命周期内永不发生改变的实例变量作为哈希码,这样对象才是可哈希的
处理字典中缺失的键
defaultdict
import collections
d = collections.defaultdict(dict)
print(d['hello'])
print(d)
d['hi'] = "你好"
print(d)
print(d['hi'])
print(d)
missing
class UserDict(dict):
def __missing__(self, key):
return "hello"
def get(self, key, default=None):
return self[key]
def __contains__(self, item):
return item in self.keys() or str(item) in self.keys()
d = UserDict()
print(d.get('hello', default="你好"))
print(d['hi'])
d['hi'] = "你好"
print(d['hi'])