文章目录
- collections
- Counter
- deque
- defaultdict
- OrderedDict
刷leetcode碰到很多可以直接用python本身提供的一些库和结构,感觉有必要汇总一下,之前列过一次数据结构,太基础还是不够用。
https://blog.csdn.net/wwang_123/article/details/134994224
随时更新一下吧,常看常新。
https://docs.python.org/zh-cn/3.13/library/datatypes.html
collections
Counter
方便、快速的计数;
类似于字典,如果某个项缺失,会返回0,而不是报错;
from collections import *#Counter
cnt = Counter()
wordList = ["a","b","c","c","a","a"]
for word in wordList:cnt[word] += 1
print(cnt)
# Counter({'a': 3, 'c': 2, 'b': 1})c=Counter("gallery")
print(c)
# Counter({'l': 2, 'g': 1, 'a': 1, 'e': 1, 'r': 1, 'y': 1})# 常用操作
# 统计所有的数目
print(sum(c.values()))
# 7# 列出所有唯一的元素
print(list(c))# 转换为set
print(set(c))
# ['g', 'a', 'l', 'e', 'r', 'y']# 转换为常规的dict
print(dict(c))
# {'a', 'e', 'g', 'l', 'r', 'y'}
deque
栈和队列的一种广义实现,支持两端插入和删除元素
append(x)
appendleft(x)
count(x) # 返回deque中元素等于x的个数
extend(iterable)
extendleft(iterable)
pop()
popleft()
remover(value)# 移除第一次出现的value,如果没找到,报错
reverse() # 反转deque的元素,并返回None
rotate(n) # 从右侧反转n步,如果n为负数,则从左侧反转,d.rotate(1)等于d.appendleft(d.pop());
from collections import dequed=deque("abc")
print(d)
# deque(['a', 'b', 'c'])d.append('j')
d.appendleft('f')
print(d)
# deque(['f', 'a', 'b', 'c', 'j'])d.pop()
d.popleft()
print(d)
# deque(['a', 'b', 'c'])
defaultdict
defaultdict是内置数据类型dict的一个子类,基本功能与dict一样,只是重写了一个方法__missing__(key)和增加了一个可写的对象变量default_factory
from collections import defaultdicts = [('yellow',1),('blue',2),('yellow',3),('blue',4),('red',5)]
d = defaultdict(list)
for k,v in s:d[k].append(v)
print(d)
# defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [5]})# 设置default_factory为int,使得defaultdict可以用于计数
s="testdefaultdefault"
d=defaultdict(int)
for k in s:d[k]+=1
print(d)
# defaultdict(<class 'int'>, {'t': 4, 'e': 3, 's': 1, 'd': 2, 'f': 2, 'a': 2, 'u': 2, 'l': 2})# 将default_factory设置为set,使得defaultdict可以建立一个关于set的词典
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k,v in s:d[k].add(v)
print(d)
# defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
OrderedDict
类似于正常的词典,只是记住了元素插入的顺序,当在有序的词典上迭代时,返回的元素就是它们第一次添加的顺序。
from collections import OrderedDict
d = {"banana":3,"apple":2,"pear":1,"orange":4}
print(OrderedDict(sorted(d.items(),key=lambda t: t[0])))
# OrderedDict([('apple', 2), ('banana', 3), ('orange', 4), ('pear', 1)])print(OrderedDict(sorted(d.items(),key=lambda t: t[1])))
# OrderedDict([('pear', 1), ('apple', 2), ('banana', 3), ('orange', 4)])print(OrderedDict(sorted(d.items(),key = lambda t:len(t[0]))))
# OrderedDict([('pear', 1), ('apple', 2), ('banana', 3), ('orange', 4)])