<jupyter_start><jupyter_text>Collections 容器数据类型 1. class collections.ChainMap(*maps)<jupyter_code>pass<jupyter_output><empty_output><jupyter_text>2. class collections.Counter([iterable-or-mapping])一个计数器工具提供快速和方便的计数<jupyter_code>from collections import Counter

cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    cnt[word] += 1
cnt
# import re

# words = re.findall(r'\w+', open('hamlet.txt').read().lower())
# Counter(words).most_common(10)
c = Counter()
# 从一个iterable的对象创建
c = Counter("gallahad")
c
c = Counter([1, 1, 2, 3, 5])
c
# 从一个mapping的对象创建
c = Counter({'red': 4, 'blue': 2})
c
c = Counter(['eggs', 'ham'])
c
c['bacon']  
c['sausage'] = 0
c
del c['sausage'] 
c
# elements() 返回一个迭代器，每个元素重复计数的个数。元素顺序是任意的。
# 如果一个元素的计数小于1， elements() 就会忽略它。
# 这里a是4个，b是2个，所以elements() 会返回4个a和2个b。
c = Counter(a=4, b=2, c=0, d=-2)
c
sorted(c.elements())
# most_common([n])
# 返回一个包含n个最多元素和他们的计数。如果n没有传入或None，
# most_common()返回所有计数器的元素
c = Counter('abracadabra')
c
c.most_common(3)
c.most_common()
# subtract([iterable-or-mapping])
# 从 迭代对象 或 映射对象 减去元素。
# 像 dict.update() 但是是减去，而不是替换。
# 输入和输出都可以是0或者负数。
c = Counter(a=4, b=2, c=0, d=-2)
c
d = Counter(a=1, b=2, c=3, d=4)
d
c.subtract(d)
c
sum(c.values()) # total of all counts
c.clear()   # reset all counts
c
c = Counter(a=1, b=2, c=3, d=4)
list(c)
set(c)
dict(c)
c.items()
# convert from a list of (elem, cnt) pairs
list_of_pairs = (('a', 1), ('b', 2), ('c', 3), ('d', 4))
Counter(dict(list_of_pairs))
# n least common elements, 最少的n个元素
# c.most_common()[:-n-1:-1] 
c.most_common()[:-3:-1]
c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
c + d
c - d
c & d
c | d
c = Counter(a=2, b=-4)
+c
-c<jupyter_output><empty_output><jupyter_text>3. class collections.deque([iterable[, maxlen]])* 线程安全* 双端append和pop复杂度均为O(1)返回一个新的双向队列对象，从左到右初始化(用方法 append()) ，从 iterable （迭代对象) 数据创建。如果 iterable 没有指定，新队列为空。Deque队列是由栈或者queue队列生成的（发音是 “deck”，”double-ended queue”的简称）。Deque 支持线程安全，内存高效添加(append)和弹出(pop)，从两端都可以，两个方向的大概开销都是 O(1) 复杂度。如果 maxlen 没有指定或者是 None ，deques 可以增长到任意长度。否则，deque就限定到指定最大长度。一旦限定长度的deque满了，当新项加入时，同样数量的项就从另一端弹出。限定长度deque提供类似Unix filter tail 的功能。它们同样可以用与追踪最近的交换和其他数据池活动。append(x)添加 x 到右端。appendleft(x)添加 x 到左端。pop()移去并且返回一个元素，deque最右侧的那一个。如果没有元素的话，就升起 IndexError 索引错误。popleft()移去并且返回一个元素，deque最左侧的那一个。如果没有元素的话，就升起 IndexError 索引错误。index(x[, start[, stop]])返回第 x 个元素（从 start 开始计算，在 stop 之前）。返回第一个匹配，如果没找到的话，升起 ValueError 。insert(i, x)在位置 i 插入 x 。如果插入会导致一个限长deque超出长度 maxlen 的话，就升起一个 IndexError 。<jupyter_code>from collections import deque

d = deque('ghi')
d
# 迭代
for elem in d:
    print(elem.upper())
# 向右添加
d.append('j')
d
# 向左添加
d.appendleft('f') 
d
# 从右侧弹出
x = d.pop()
x
d
# 从左侧弹出
x = d.popleft()
x
d
list(d)
list(reversed(d))
'h' in d
# 向右拓展d
d.extend('abc')
d
# 向左拓展d，注意结果
d.extendleft('123')
d
# 向右移动1位
d.rotate(1)
d
# 向左移动2位
d.rotate(-2)
d
# 清空
d.clear()
d<jupyter_output><empty_output><jupyter_text>4. class collections.defaultdict([default_factory[, ...]])<jupyter_code>from collections import defaultdict

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
d
for k, v in s:
    d[k].append(v)
d
sorted(d.items())
# 上面的代码与下面的等价，但是更快
d = {}
for k, v in s:
    d.setdefault(k, []).append(v)
d
s = 'mississippi'
d = defaultdict(int)
for k in s:
    d[k] += 1
d
sorted(d.items())<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.18433734939759036, 'fraction_numerical': 0.020180722891566263, 'mean_word_length': 6.036016949152542, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '209435', 'license': 'MIT', 'n_tokens_mistral': 1877, 'n_tokens_neox': 1966, 'n_words': 320, 'path': 'data_types/collections.ipynb', 'repo_name': 'FatEagle/Python-Notes', 'size': '3320'}