26 python进阶collections标准库( 四 )

Counter 对象进行数学运算时同样会保持顺序 。结果会先按每个元素在运算符左边的出现时间排序,然后再按其在运算符右边的出现时间排序 。
elements()返回一个迭代器,其中每个元素将重复出现计数值所指定次 。元素会按首次出现的顺序返回 。如果一个元素的计数值小于一,elements() 将会忽略它 。
>>> c = Counter(a=4, b=2, c=0, d=-2)>>> list(c.elements())['a', 'a', 'a', 'a', 'b', 'b']most_common([n])返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序 。如果 n 被省略或为 Nonemost_common() 将返回计数器中的所有元素 。计数值相等的元素按首次出现的顺序排序:
>>> Counter('abracadabra').most_common()[('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)]>>> Counter('abracadabra').most_common(2)[('a', 5), ('b', 2)]应用场景Counter对象一般有以下两种应用场景1. 统计单词在列表中的出现次数
>>> count = Counter()>>> list1 = ['red', 'blue', 'red', 'green', 'blue', 'blue']>>> for word in list1: count[word] += 1>>> countCounter({'blue': 3, 'red': 2, 'green': 1})count[word]因为没有在Counter对象中,所以默认情况下会给他赋值为0,因此可以统计出单词出现的次数
2. 找出文件中最常见的十个单词
>>> import re>>> words = re.findall(r'\w+', open('log.txt').read().lower())>>> Counter(words).most_common(10)[('the', 1180), ('and', 822), ('to', 810), ('of', 799), ('i', 688), ('you', 510),('a', 508), ('my', 500), ('yes', 406), ('in', 318)]deque([iterable[, maxlen]])返回一个新的双向队列对象,从左到右初始化(用方法 append()),从 iterable (迭代对象) 数据创建 。如果 iterable 没有指定,新队列为空 。
Deque队列是由栈或者queue队列生成的 。Deque 支持线程安全,内存高效添加(append)和弹出(pop),从两端都可以,两个方向的大概开销都是 O(1) 复杂度 。
虽然 list 对象也支持类似操作,不过这里优化了定长操作和 pop(0)insert(0, v) 的开销 。它们引起 O(n) 内存移动的操作,改变底层数据表达的大小和位置 。
如果 maxlen 没有指定或者是 Nonedeques 可以增长到任意长度 。否则,deque就限定到指定最大长度 。一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出 。
deque的方法双向队列(deque)对象支持很多方法,大部分方法list都有
方法名作用append(x)添加 x 到右端appendleft(x)添加 x 到左端clear()移除所有元素,使其长度为0copy()创建一份浅拷贝count(x)计算 deque 中元素等于 x 的个数extend(iterable)扩展deque的右侧,通过添加iterable参数中的元素extendleft(iterable)扩展deque的左侧,通过添加iterable参数中的元素 。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加index(x[, start[, stop]])返回 x 在 deque 中的位置(在索引 start 之后,索引 stop 之前) 。返回第一个匹配项,如果未找到则引发 ValueErrorinsert(i, x)在位置 i 插入 x,如果插入会导致一个限长 deque 超出长度 maxlen 的话,就引发一个 IndexError 。pop()移去并且返回一个元素,deque 最右侧的那一个 。如果没有元素的话,就引发一个 IndexErrorpopleft()移去并且返回一个元素,deque 最左侧的那一个 。如果没有元素的话,就引发 IndexErrorremove(value)移除找到的第一个 value 。如果没有的话就引发 ValueErrorreverse()将deque逆序排列 。返回 None。rotate(n=1)向右循环移动 n 步 。如果 n 是负数,就向左循环 。如果deque不是空的,向右循环移动一步就等价于

经验总结扩展阅读