collections

collections模块实现了专门的容器数据类型,提供了Python的通用内置容器,dict,list,set和tuple的替代方法。提供了许多有用的集合类

namedtuple

一般的tuple是没有名字('a', 'b', 'c'),想获取值为’b’只能根据下标1, 我们想要类似dict/class获取key对应的value下面namedtuple就用到了。在获取一些不可修改的熟悉就很方便

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import namedtuple

# tuple 
t = (20, 18, 20)
print(t.index(20)) # 0 获取值为20第一个下标
print(t.count(20)) # 2 获取值为20的个数
print(t[0]) # 20

# namedtuple
People = namedtuple("People", ['age', 'sex', 'height'])
p = People(age=20, sex='男', height=20)
print(p.age) # 获取age 20
print(p.count(20)) # 2 获取20的个数
print(p.index(20)) # 0 获取第一下标

namedtuple是不是像class一样方便,也不怕熟悉值被修改

defaultdict

dict是我们常用的数据结构,用起来很方便,但是在一些特殊情况下有不是很方便,比如一个字符串abcdabcabc统计abcd的个数。使用defaultdict就很方便了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from collections import defaultdict

count = defaultdict(int)
for i in "abcdabcabc":
    count[i] += 1

print(count) # {'a': 3, 'b': 3, 'c': 3, 'd': 1})

# defaultdict(list) 默认值list
array = defaultdict(list)
for i in "abcdabcabc":
    array[i].append(i)

print(array) # {'a': ['a', 'a', 'a'], 'b': ['b', 'b', 'b'], 'c': ['c', 'c', 'c'], 'd': ['d']})

# 自定义默认值
default = defaultdict(lambda: 'fluobo.cn')
print(default['as']) # 我是默认值

OrderedDict

dict默认是无序(面试就经历过)的,遍历时不会按照你设置key的顺序来输出,在有些场景下时需要需要有序dict,比如比赛赛跑,key为运动员编号,value为用时。前三名直接for循环就可以获得

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from collections import OrderedDict

match = OrderedDict()
match['A001'] = '18.8'
match['A003'] = '20.0'
match['A005'] = '23.3'
match['A002'] = '24.0'

d = [v for i, v in enumerate(match.items()) if i < 3] #[('A001', '18.8'), ('A003', '20.0'), ('A005', '23.3')]

# 移动key到最后为止
# move_to_end()

Counter

一个 dict 的子类,用于计数可哈希对象. 接受对象是可以迭代对象。为统计而生

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
c = Counter("abcabcabc") # {'a': 3, 'b': 3, 'c': 3}
c1 = Counter(['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b']) # {'a': 3, 'b': 3, 'c': 2}

# 直接设置key
c2 = Counter(a=2)

# elements() 返回一个迭代器,每个元素重复计数的个数
list(c2.elements()) # ['a', 'a']

# most_common(n) 返回一个list 提供 n 个以上频率最高的元素和计数
c1.most_common(2) # [('a', 3), ('b', 3)]

# subtract 从 迭代对象 或 映射对象 减去元素有点像dict.update()
c.subtract(c1) # c - c1 # {'c': 1, 'a': 0, 'b': 0}