origin dict: {'andy': 12, 'bob': 3, 'candy': 6}-------------------- __setitem__ --------------------------------------------------after inserted: {'andy': 12, 'bob': 3, 'candy': 6, 'fancl': 13}-------------------- setdefault() --------------------------------------------------andy: 12david: 10after inserted: {'andy': 12, 'bob': 3, 'candy': 6, 'fancl': 13, 'david': 10}
字典推导可以从任何以键值对作为元素的可迭代对象中构建出字典
numbers = [('one',1),('two',2),('three',3)] num_dict = {value:name for name,value in numbers} print(num_dict) num_dict_upper = {value:name.upper() for value,name in num_dict.items()} print(num_dict_upper)输出:{1: 'one', 2: 'two', 3: 'three'}{1: 'ONE', 2: 'TWO', 3: 'THREE'}
andybobcandy----------------------------------------------------------------------------------------------------andybobcandy----------------------------------------------------------------------------------------------------('andy', 12)('bob', 3)('candy', 6)
{'one': 1, 'two': 2, 'three': 3}{'one': 1, 'two': 4, 'three': 3}{'one': 1, 'two': 4, 'three': 3, 'five': 5}----------------------------------------------------------------------------------------------------{one: 1, two: 2, three: 3}{one: 1, two: 4, three: 3}
dog : 3cat : 3hits : 1hates : 1you : 1eat : 1but : 1not : 1
dog : 3cat : 3hits : 1hates : 1you : 1eat : 1but : 1not : 1
a [(0, 1), (0, 15), (1, 1), (1, 15)]animals [(2, 5)]by [(0, 12), (1, 12)]cat [(0, 17), (1, 3)]dog [(0, 3), (1, 17)]sit [(2, 13)]sits [(0, 7), (1, 7)]together [(2, 17)]two [(2, 1)]
__missing__方法只会被__getitem__调用
提供__missing__方法时get或者__contains__的使用都没有影响
class StrKeyDict0(dict): # __getitem__方法未获取到key时,调用__missing__方法 def __missing__(self, key): if(isinstance(key,str)): raise KeyError(key) return self[str(key)] # 这里利用self[key]把属性获取委托给__getitem__ def get(self, key,default=None): try: return self[key] except KeyError: return default def __contains__(self, item): return item in self.keys() or str(item) in self.keys() sk = StrKeyDict0([('2','two'),('4','four')]) # 调用__getitem__ print(sk[2]) # 调用get print(sk.get(4))输出:twofour
OrderedDict在添加键的时候会保持顺序,因此键的迭代顺序与输入保持一致
OrderedDict的popitem方法默认删除并返回字典里最后一个元素,但传递last=False参数,那么它删除并返回第一个被添加进去的元素
from collections import OrderedDict dog_names = ['daniel','fancl','grace'] dog_ages = [9,10,11] dog_dict = dict(zip(dog_names,dog_ages)) print('before pop:',dog_dict) # 随机移除元素 print('pop item:',dog_dict.popitem()) print('after pop:',dog_dict) print('-'*100) cat_names = ['andy','bob','candy'] cat_ages = [12,3,6] cat_dict = OrderedDict(zip(cat_names,cat_ages)) #cat_dict.move_to_end('bob',False) print('before pop:',cat_dict) # last=False按先进先出顺序移除 # last=True按后进先出顺序移除 print('pop item:',cat_dict.popitem(last=False)) print('after pop:',cat_dict)输出:
before pop: {'daniel': 9, 'fancl': 10, 'grace': 11}pop item: ('grace', 11)after pop: {'daniel': 9, 'fancl': 10}----------------------------------------------------------------------------------------------------before pop: OrderedDict([('andy', 12), ('bob', 3), ('candy', 6)])pop item: ('andy', 12)after pop: OrderedDict([('bob', 3), ('candy', 6)])
一个计数器字典
对传入的可迭代对象进行计数,形成一个字典
每次update的时候会增加这个计数器
most_common(n)会按照次序返回映射里最常见的n个键和它们的计数
import collections count = collections.Counter('abrabcablle') print('count :',count) count.update('abrabcablle') print('count :',count) print('count.most_common(2) : ',count.most_common(2))输出:count : Counter({'a': 3, 'b': 3, 'l': 2, 'r': 1, 'c': 1, 'e': 1})count : Counter({'a': 6, 'b': 6, 'l': 4, 'r': 2, 'c': 2, 'e': 2})count.most_common(2) : [('a', 6), ('b', 6)]
UserDict不是dict的子类,但UserDict有一个叫data的属性,是dict的实例
import collections class StrKeyDict(collections.UserDict): def __missing__(self, key): if(isinstance(key,str)): raise KeyError(key) return self.data[str(key)] def __setitem__(self, key, value): self.data[str(key)] = value def __contains__(self, item): return str(item) in self.data sk = StrKeyDict([('2','two'),('4','four')]) # 调用__getitem__ print(sk[2]) # 调用get # UserDict继承Mapping.get方法,源码与StrKeyDict0中的写法相同,所以不需要再改写 print(sk.get(4))输出:twofour
标准库里的所有映射都是可变的
types模块引入了一个封装类名叫MappingProxyType,如果给这个类一个映射,会返回一个只读的映射视图
但它是动态的,意味着如果对原映射做出改动,我们通过这个视图可以观察到
from types import MappingProxyType d = dict([(1,'one')]) md = MappingProxyType(d) print('md :',md) print('md[1] : ',md[1]) # 只读的视图,不允许赋值 # TypeError: 'mappingproxy' object does not support item assignment # md[2] = 'two' d[2] = 'two' # 但会根据原映射动态修改 print('md :',md)输出:md : {1: 'one'}md[1] : onemd : {1: 'one', 2: 'two'}
set(){1, 2, 3}{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
如果你实现了一个类的__eq__方法,并且希望它是可散列的,那么它一定要有个恰当的__hash__方法,保证在a==b为真的情况下hash(a)==hash(b)也必定为真。否则会破坏恒定的散列表算法
另一方面,如果一个含有自定义的__eq__依赖的类处于可变的状态,那就不要在这个类中实现__hash__方法,因为它的实例是不可散列的
转载于:https://www.cnblogs.com/StackNeverOverFlow/p/9873764.html