流畅的Python
第三章总结
- 字典推导
>>> a = [(86, 'China'), (91, 'india')]
>>> b = {code: contry for code,contry in a}
>>> b
{86: 'China', 91: 'india'}
>>> { code : contry for code, contry in b.items()}
{86: 'China', 91: 'india'}
以元组形式items()返回dict的所有键值对。
- 使用setfault处理找不到的键
当字典dic[k]不能找到正确的键的时候,python会抛出异常,通常可以使用dic.get(k, default)来代替d[k],当找不到键时,可以返回一个默认值,但是却不能改变字典的值,可以使用setfault来处理。
dict.setfault(key, []).append(new_value)
就等于
if key not in dict:
dict[key] = []
dict[key].append(new_value)
- 集合论
集合可用于去重
>>> l = ['spam', 'spam', 'eggs', 'spam']
>>> set(l)
{'spam', 'eggs'}
>>> list(set(l))
['spam', 'eggs']
a和b是两个集合,a|b返回是它们的合集,a&b返回的是它们的交集,a-b返回它们的差集。
found = len(needles & haystack)
找到needles有多少个元素在haystack。
set.intersection(set1, set2 ... etc)
set.union(set1, set2 ... etc)
intersection()返回一个集合set和set1,set2…的交集,set必须为集合,set1,set2为可迭代对象即可。
union()返回一个集合set和set1,set2…的合集,set必须为集合,set1,set2为可迭代对象即可。
>>> a = [1, 2, 3]
>>> b = [3, 4, 5]
>>> set(a).intersection(b)
{3}
>>> a.intersection(b)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
a.intersection(b)
AttributeError: 'list' object has no attribute 'intersection'
创建空集合需使用set(),如果使用 a = {},创建的是一个空字典。
- 集合的数学运算
运算符 | 特殊方法 |
---|---|
s & z | __and__ |
s &= z | __iadd__ |
s | z | __or__ |
s |= z | __ior__ |
s - z | __sub__ |
s -= z | __isub__ |
s ^ z | __xor__ |
s ^= z | __ixor__(对称差集,即不属于A&B的元素的集合) |
s.isdisjoint(z) | 查看s和z是否不相交 |
s in z | z.__contains__(s) |
s <= z | s.__le__(z)(s是否为z的子集) |
s.issubset(z) | s是否为z的子集,z为可迭代对象 |
s < z | s.__lt__(z)(s是否为z的真子集) |
s >= z | s.__ge__(z)(s是否为z的父集) |
s.issuperset(z) | s是否为z的父集,z为可迭代对象 |
s > z | s.__gt__(z)(s是否为z的真父集) |
s.add(e) | 把元素e添加到s中 |
s.clear() | 移除s中的所有元素 |
s.copy() | 对s进行浅复制 |
s.disard(e) | 如果s里有e这个元素的话,把他移除 |
s.__iter__() | 返回s的迭代器 |
s.__len()__ | len(s) |
s.pop() | 从s中移除一个元素并返回它的值,若s为空,则抛出KeyError异常 |
s.remove(e) | 从s中移除e元素,若e元素不存在,则抛出KeyError异常 |
- 集合和字典的效率远远高于列表。