Python内置模块collections解析

python的collections模块提供了非常多方便的操作,例如

image-20240326133642376

  • Counter
  • defaultdict()
  • OrderDict()
  • deque
    • 双端队列
  • namedtuple()

下面将逐个介绍每一个具体类的用法

Counter类

该类可以快速的进行统计,例如给定一个字符串之后,可以统计每个字符出现的次数,当然只要是可迭代【可哈希】的数据都是可以传给Counter中的,例如list,tuple等

image-20240326134016203

1
2
3
4
5
from collections import Counter

string = "abcdeasdasdkjyhaksjdhkashd"
myhash = Counter(string)
print(myhash)

该类中提供了几个方法可以使用

  • most_common()
    • 可以将字典中的元素按照出现次数组成一个元素,再按照出现次数从大到小排列成一个列表
    • 例如:[(‘a’, 5), (‘d’, 5), (‘s’, 4), (‘k’, 3), (‘h’, 3), (‘j’, 2), (‘b’, 1), (‘c’, 1), (‘e’, 1), (‘y’, 1)]
  • element()
    • 该方法会返回一个迭代器,其中包含元素的重复次数,如果这个元素出现次数为0,则不会返回该元素,可以作为字符串对其进行处理
1
2
3
my = Counter("123123asdasdas")
print("".join(my.elements()))
# 112233aaasssdd

defaultdict类

普通的字典在使用的时候,如果键不存在则会报错KeyError,这一点很影响使用体验,当然也可以每次都采用dic.get(key, defaultValue)的方式去获取值。这时就可以使用defaultdic来创建一个具有默认值的字典,这里的类型可以是整型、浮点型、列表、元祖、集合、字典等。

类型 初始值
int 0
float 0.0
list []
tuple ()
set set()
dict {}
1
2
3
4
from collections import defaultdict

dic = defaultdict(dict)
print(dic[1])

OrderDict

OrderDict是一个可以按照元素添加顺序来存储键值对的字典类型,可以确保元素的顺序性。除了拥有普通字典的所有的操作以外,多了个顺序性。

底层采用的是双向链表,可以解决LRU算法的问题

1
2
3
4
5
6
7
8
from collections import OrderedDict

od = OrderedDict()
od[1] = "Python"
od[2] = "Java"
od[3] = "Golang"
print(od)
# OrderedDict([(1, 'Python'), (2, 'Java'), (3, 'Golang')])

可以确保元素的打印顺序

其中有几个实用的方法:

  • popitem(last=True)
    • 该方法会移除字典最后一个元素,可以接收一个参数,如果为空默认为True移除最后一个元素,如果为False则移除第一个元素。
  • move_to_end(key, last=True)
    • 该方法会将指定key位置的元素移动到字典的最后【默认情况】,如果last为False则移动到最开头位置。
1
2
3
4
5
6
7
8
9
10
11
12
13
from collections import OrderedDict

od = OrderedDict()
od[1] = "Python"
od[2] = "Java"
od[3] = "Golang"
print(od)
# od.popitem(0)
# print(od)
od.move_to_end(3,False)
print(od)
# OrderedDict([(1, 'Python'), (2, 'Java'), (3, 'Golang')])
# OrderedDict([(3, 'Golang'), (1, 'Python'), (2, 'Java')])

deque

作为一个双端队列,此部分可以参考【二叉树总结

实现树的层次遍历,使用popleft()方法可以提升效率。