collections库
defaultdict
#dict当中最常见的问题,就是key为空的情况
#基础写法 dict.get("key",None)
#比如当key存在重复,我们希望将key相同的value存进一个list当中,而不是只保留一个。这种情况下写成代码就会比较复杂
data = [(1, 3), (2, 1), (1, 4), (2, 5), (3, 7)]
d = {}
for k, v in data:
if k in d:
d[k].append(v)
else:
d[k] = [v]
#方法升级
for k, v in data:
cur = d.get(k, [])
cur.append(v)
d[k] = cur
#利用defaultdict
d = defaultdict(list)
for k, v in data:
d[k].append(v)
d = defaultdict(lambda :1)
使用defaultdict之后,如果key不存在,容器会自动返回我们预先设置的默认值。需要注意的是defaultdict传入的默认值可以是一个类型也可以是一个方法。
counter
from collections import Counter
words = ['apple', 'apple', 'pear', 'watermelon', 'pear', 'peach']
words1 = ['apple', 'apple', 'pear', 'watermelon', 'pear', 'peach']
counter = Counter(words)
# print(counter)
# print(counter.most_common(2))
counter1 = Counter(words1)
print(counter1-counter)
counter 计数器可以解决数数和排序问题,筛选topK有most_common方法,还支持加减法的操作,比如我们可以将两个Counter相加,它会自动将两个Counter合并,相同的key对应的value累加。
deque
deque是双端队列,允许在队首和队尾插入元素,弹出元素,deque收到GIL的管理,它是线程安全的,而list则没有GIL锁,因此不是线程安全的。也就是说在并发场景下,list可能会导致一致性问题,而deque不会。deque支持固定长度,当长度满了之后,当我们继续append时,它会自动弹出最早插入的数据。
from collections import deque
dque = deque(maxlen=10)
# 假设我们想要从文件当中获取最后10条数据
for i in f.read():
dque.append(i)
dque.popleft()
deque.appendleft(1)
ll = [1, 2, 3]
q.extendleft(ll)
namedtuple
namedtuple是一个非常简单的元类,通过它我们可以非常方便地定义我们想要的类。
Student = namedtuple('Student', ['name', 'score', 'age'])
s = Student(name="hh", age=10, score=10)
print(s.name)
print(s.__doc__)
s1 = Student(name='ww', age=20, score=20)
print(s1)
print(s[1]+s[2])
print(s._asdict())
ChainMap
将多个map组成一个新的单元(原来的map结构仍然存在,类似于这些map被存在了一个list之中
from collections import ChainMap
m1 = {'color': 'red', 'user': 'guest'}
m2 = {'name': 'drfish', 'age': '18'}
chainMap = ChainMap(m1, m2)
print(chainMap) # ChainMap({'color': 'red', 'user': 'guest'}, {'name': 'drfish', 'age': '18'})
print(chainMap['color']) # red
print(chainMap.items()) # ItemsView(ChainMap({'color': 'red', 'user': 'guest'}, {'name': 'drfish', 'age': '18'}))
chainMap['1'] = 2
print(chainMap)
# 新增
m1 = {'a': 'b'}
chainMap.new_child(m1)
print(chainMap.items())
print(chainMap.maps)
OrderedDict
提供一个有序的字典,从而可以实现遍历操作。内部存储顺序根据传入顺序给定。
from collections import OrderedDict
d1 = {}
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'
d2 = {}
d2['c'] = 'C'
d2['a'] = 'A'
d2['b'] = 'B'
print(d1 == d2)
d1 = OrderedDict()
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'
d2 = OrderedDict()
d2['c'] = 'C'
d2['a'] = 'A'
d2['b'] = 'B'
print(d1 == d2)