collections库

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值