散列表
是字典类型性能出众的根本原因
可散列的数据类型:如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__()
方法
需要有__eq__()
方法才可以与其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的。
散列值:对象的id()
函数的返回值
一个可散列的对象必须满足以下要求。
(1) 支持 hash() 函数,并且通过 hash__() 方法所得到的散列值是不变的。(2) 支持通过 __eq() 方法来检测相等性。 (3) 若 a == b 为真,则 hash(a) == hash(b) 也为真。
a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('one', 1), ('two', 2), ('three', 3)])
e = dict({"one": 1, "two": 2, "three": 3})
f = {i: j for i, j in [("one", 1), ("two", 2), ("three", 3)]} # 字典推导式
test_str = 'ashjdlkqashfljkaskldfjalshflaksdnvklzkxcbfihqwdjuabs'
for index, s in enumerate(test_str):
if s not in my_dict:
my_dict[s] = []
my_dict[s].append(index)
my_dict = {}
for index, s in enumerate(test_str):
my_dict.setdefault(s, []).append(index)
上面的问题使用defaultdict
可以很方便的解决
import collections
my_dict = collections.defaultdict(list)
for index, i in enumerate(test_str):
my_dict[i].append(index)
defaultdict
在使用get方法的时候不会自动创建默认的类型
missing
print(my_dict['a1']) # []
print(my_dict.get('a2')) # None
collections.OrdereDict
import collections
a = collections.OrderedDict()
a['a'] = 1
a['c'] = 3
a['b'] = 2
print(a) # OrderedDict([('a', 1), ('c', 3), ('b', 2)])
a.popitem()
print(a) # OrderedDict([('a', 1), ('c', 3)])
collections.ChainMap
一个
ChainMap
类是为了将多个映射快速的链接到一起,这样它们就可以作为一个单元处理。它通常比创建一个新字典和多次调用update()
要快很多。 这个类可以用于模拟嵌套作用域,并且在模版化的时候比较有用。
将多个字典或者其他映射组合在一起,创建一个单独的可更新的视图
b = collections.ChainMap(locals())
b
创建一个对象,它内部包含了当前的局部变量
直接使用b['a']
方法去查找内容
!b['a']
collections.Counter
c = collections.Counter("asfsdfasdfasdfasdf")
print(c)# Counter({'s': 5, 'f': 5, 'a': 4, 'd': 4})
纯python实现的dict
字典在内存上的开销巨大。
如果需要存储数量巨大的内容,推荐使用元祖或者具名元祖。
字典的实现是典型的空间换时间