输出
0set()[]
小例子1使用 list
作为 default_factory
,我们可以很轻松地将(键-值对组成的)序列转换为(键-列表组成的)字典:
>>> from collections import defaultdict>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]>>> d = defaultdict(list)>>> for k, v in s: d[k].append(v)>>> sorted(d.items())[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
小例子2设置 default_factory
为 int
,使 defaultdict
用于计数
>>> s = 'aiibiicii'>>> d = defaultdict(int)>>> for k in s: d[k] += 1>>> sorted(d.items())[('a', 1), ('b', 1), ('c', 1), ('i', 6)]
小例子3如果你需要自己定义一个返回值,你可以创建1个函数,设置自定义的返回值
def constant_factory(value):return lambda: valued = defaultdict(constant_factory('success'))d.update(status=200)var = d['message']print(sorted(d.items()))# 输出[('message', 'success'), ('status', 200)]
Counter对象它一个计数器工具提供快速和方便的计数 。它是 dict
的子类 , 用于计数可哈希对象 。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值 。计数可以是任何整数值,包括0和负数 。
创建方式元素从一个 iterable
被计数或从其他的 mapping (or counter)
初始化:
c = Counter()# a new, empty counterc = Counter('gallahad')# a new counter from an iterablec = Counter({'red': 4, 'blue': 2})# a new counter from a mappingc = Counter(cats=4, dogs=8)# a new counter from keyword args
如果引用的键没有任何记录,就返回一个0,而不是弹出一个 KeyError
>>> c = Counter(['eggs', 'ham'])>>> c['bacon']0
作为 dict
的子类,Counter
继承了记住插入顺序的功能 。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
被省略或为 None
,most_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
没有指定或者是 None
,deques
可以增长到任意长度 。否则,deque就限定到指定最大长度 。一旦限定长度的deque满了 , 当新项加入时,同样数量的项就从另一端弹出 。
deque的方法双向队列(deque)对象支持很多方法,大部分方法list
都有
推荐阅读
- 信号量 C# 多线程访问之 SemaphoreSlim【C# 进阶】
- 炉石传说新手攻略萌新到底怎么玩(炉石传说新手进阶流程)
- 38 全球名校AI课程库| 马萨诸塞大学 · 自然语言处理进阶课程『Advanced Natural Language Processing』
- Python基础指面向对象:2、动静态方法
- Python基础之面向对象:3、继承与派生
- ysoserial CommonsCollections2 分析
- 如何免安装使用 Python?推荐 17 个在线的 Python 解释器!
- Python处理刚刚,分钟,小时,天前等时间
- python渗透测试入门——取代netcat
- 六 Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待