collections(容器数据类型)
- 描述
collections模块实现了特定目标的容器,以提供Python标准内建容器:dict,list,set和tuple的替代选择
namedtuple() | 创建命名元素子类的工厂函数 |
---|---|
deque | 类似列表的容器,实现了在两端快速添加(append)和弹出(po) |
ChainMap | 类似字典的容器类,将多个映射集合到一个视图里 |
Counter | 字典的子类,提供了可哈希对象的计数功能 |
OrderdDict | 字典的子类,保存了它们被添加的顺序 |
defaultdict | 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值 |
- namedtuple()
语法
collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
返回值:
返回一个新的元组子类,名为typename
。这个新的子类用于创建类元组的对象,可以通过域名来获取属性值,同样也可以通过索引和迭代获取值。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
print(type(p)) # 返回一个新的元组子类,名为typename
# 输出结果:<class '__main__.Point'>
print(p[0] + p[1]) # 可以通过索引访问元组中的元素
# 输出结果:33
x, y = p # 分开,类似于常规的元组
print(x, y)
# 输出结果:11 22
print(p.x + p.y) # 通过名访问元素
# 输出结果:33
print(p)
# 输出结果:Point(x=11, y=22)
-deque
deque
是为了高效实现插入和删除操作的双向列表,适用于队列和栈。list
是线性存储,数据量大的时候,插入和删除效率很低。
deque对像支持的方法:
方法 | 实现功能 |
---|---|
append(x) | 添加x到右端 |
appendleft(x) | 添加x到左端 |
clear() | 移除所有元素,使其长度为0 |
copy | 创建一份浅拷贝 |
count(x) | 计算deque中个数等于x的元素 |
extent | 扩展deque的右侧,通过添加iterable参数中的元素 |
extendleft(iterable) | 扩展deque的左侧,通过添加iterable参数中的元素 |
index(x,[, start[, stop]]) | 返回第x个元素(从start开始计算,在stop之前)。返回第一个匹配,如果没找到的化,raise ValueError |
insert(i, x) | 在位置i插入x |
pop() | 移去并且返回一个元素,deque最右侧的元素 |
popleft() | 移去并切返回一个元素,deque最左侧的元素 |
reverse() | 将deque逆序排列,返回None |
例0
from collections import deque
d = deque('py')
for elem in d:
print(elem.upper())
输出结果
P
Y
例1
from collections import deque
d = deque('py')
d.append('t') # deque右侧添加一个元素
print(d)
# 输出结果:deque(['p', 'y', 't'])
d.appendleft('i') # deque左侧添加一个元素
print(d)
# 输出结果:deque(['i', 'p', 'y', 't'])
d.popleft() # 返回和一出最左侧元素
print(d)
# 输出结果:deque(['p', 'y', 't'])
print(list(d)) # 里列表形式展示出deque的内容
# 输出结果:['p', 'y', 't']
d.extend('hon')
print(d)
# 输出结果:deque(['p', 'y', 't', 'h', 'o', 'n'])
- defaultdict
语法
defaultdict([default_factory[,…]])
返回值
返回一个新的类似字典的对象。重载了一个方法并添加了一个可写的实例变量。其余的功能于dict类相同
使用list
作为default_factory
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('red', 1)
d = defaultdict(list)
for k, v in s:
d[k].append(v)
print(d.items())
# 输出结果:dict_items([('yellow', [1, 3]), ('blue', [2]), ('red', [1])])
使用int
作为default_factory
from collections import defaultdict
s = 'mississippt'
d = defaultdict(int)
for k in s:
d[k] += 1
print(list(d.items()))
# 输出结果:[('m', 1), ('i', 4), ('s', 4), ('p', 2)]
如果希望key不存在时,返回一个默认值
from collections import defaultdict
d = defaultdict(lambda: 'N/A')
d['key1'] = 'a'
print(d['key1'])
# 输出结果:a
print(d['key2'])
# 输出结果:N/A
- Counter
一个计数器工具,提供给快速和方便的计数
from collections import Counter
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'red']:
cnt[word] += 1
print(cnt)
# 输出结果:Counter({'red': 3, 'blue': 1, 'green': 1})
一个Counter
是一个dict
的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一样储存,它们的计数存储位值(value)。
Counter的方法
elements()
返回一个迭代器,每个元素重复计数的个数。元素顺序是任意的,如果一个元素的计数小于1,elements()
就会忽略它。
from collections import Counter
c = Counter(a=4, b=2, c=0, d=-2)
print(list(c.elements()))
# 输出结果:['a', 'a', 'a', 'a', 'b', 'b']
most_common([n])
返回一个列表,提供n
个频率最高的元素和计数。如果没有提供n
,或者是None
,返回计数器中的所有元素。相等个数的元素顺序随机。
from collections import Counter
c = Counter('abcdaaabcd').most_common(3)
print(c)
# 输出结果:[('a', 4), ('b', 2), ('c', 2)]
d = Counter('abcdaaabcd').most_common()
print(d)
# 输出结果:[('a', 4), ('b', 2), ('c', 2), ('d', 2)]