此栏目记录我学习《流畅的Python》一书的学习笔记,这是一个自用笔记,所以写的比较随意,随缘更新
泛映射类型
collections.abc 模块中有 Mapping 和 MutableMapping 这两个抽象基类,它们的作用是为dict 和其他类似的类型定义形式接口
from collections import abc
my_dict = {}
print(isinstance(my_dict, abc.Mapping))
运行结果:
True
通过isinstance 的结果能够判断出字典是广义上的映射类型
可散列的数据类型
如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现 __hash__() 方法。另外可散列对象还要有__qe__()方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的……
多种方式创建字典
# 多种方式创建字典
a = dict(id=1, name='jack', address='A1')
b = {'id': 1, 'name': 'jack', 'address': 'A1'}
c = dict(zip(['id', 'name', 'address'], [1, 'jack', 'A1']))
d = dict([('id', 1), ('name', 'jack'), ('address', 'A1')])
e = dict({'id': 1, 'name': 'jack', 'address': 'A1'})
print(a == b == c == d == e)
运行结果:
True
原来还可以有这么多种方式创建字典
字典推导
# 字典推导
# 字典推导
info_list = [[1, 'id'], ['jack', 'name'], ['A1', 'address']]
info_dict = {x1: x2 for x1, x2 in info_list}
print(info_dict)
# 按条件推导
rider_list = [(2000, 'Kuuga'), (2001, 'Agito'), (2002, 'Ryuki'),
(2003, 'Faiz'), (2004, 'Blade'), (2005, "Hibiki"),
(2006, 'Kabuto'), (2007, 'Den-o'), (2008, 'Kiva'),
(2009, 'Decade'), (2010, 'W')]
# 取2010年之前的骑士做字典推导
rider_dict = {x1: x2 for x1, x2 in rider_list if x1<2010}
print(rider_dict)
运行结果:
{1: ‘id’, ‘jack’: ‘name’, ‘A1’: ‘address’}
{2000: ‘Kuuga’, 2001: ‘Agito’, 2002: ‘Ryuki’, 2003: ‘Faiz’, 2004: ‘Blade’, 2005: ‘Hibiki’, 2006: ‘Kabuto’, 2007: ‘Den-o’, 2008: ‘Kiva’, 2009: ‘Decade’}
用setdefault处理找不到的键
书上那个例子太复杂,看了半天才看懂,自己写了一个
test_dict = {'A': 1, 'B': 2, 'C': 3} # 测试用字典
# 找test_dict['D'](肯定是找不到)
# 可以用 d.get(k, default) 来代替 d[k],给找不到的键一个默认的返回值
print(test_dict.get('D', 'error'))
# 但是要更新某个键对应
# 的值的时候,不管使用 __getitem__ 还是 get 都会不自然,而且效率低。
# 使用setdefault设置一个默认空值
index_list = ['A', 'B', 'C', 'D', 'E', 'F']
for item in index_list:
# 如果遇到test_dict[item],且索引item不存在,则补一个默认值
test_dict.setdefault(item, 'No Info')
print(test_dict)
运行结果:
{‘A’: 1, ‘B’: 2, ‘C’: 3, ‘D’: ‘No Info’, ‘E’: ‘No Info’, ‘F’: ‘No Info’}
有时候为了方便起见,就算某个键在映射里不存在,我们也希望在通过这个键读取值的时候能得到一个默认值。有两个途径能帮我们达到这个目的,一个是通过 defaultdict 这个类型而不是普通的 dict,另一个是给自己定义一个 dict 的子类,然后在子类中实现__missing__ 方法。
defaultdict:处理找不到的键的一个选择
import collections
# 使用 list 作为 default_factory ,可以轻松地将一系列键值对分组到列表字典中
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = collections.defaultdict(list)
for k, v in s:
d[k].append(v)
print(s)
# factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0。
dd = collections.defaultdict(str)
l = ['111', 'aaa', 'ddd']
dd['111'] = '?'
for i in l:
# 对应的键没给值,全都变成空字符串
print(dd[i])
运行结果:
[(‘yellow’, 1), (‘blue’, 2), (‘yellow’, 3), (‘blue’, 4), (‘red’, 1)]
?文章来源:https://www.toymoban.com/news/detail-429947.html
特殊方__missing__
# 继承字典类的子类
class MyDict(dict):
def __missing__(self, key):
self[key] = '默认'
return self[key]
# 测试一下
d = MyDict({'A': 1, 'B': 2, 'C': 3})
print(d)
# 找不存在的索引对应的值
print(d['D'])
运行结果:
{‘A’: 1, ‘B’: 2, ‘C’: 3}
默认文章来源地址https://www.toymoban.com/news/detail-429947.html
到了这里,关于【流畅的Python学习笔记】2023.4.29的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!