实用干货:collections 内置模块中文文档
本帖最后由 zltzlt 于 2019-10-27 16:56 编辑这里是实用干货:collections 内置模块中文文档。
如果喜欢,不要忘记评分哦!{:10_281:}
此模块实现了专门的容器数据类型,提供了 Python 通用内置容器、dict、list、set 和 tuple 的替代容器。
此模块提供的函数及类如下:
函数 / 类说明
namedtuple用于创建具有关键字参数的元组子类的函数。
deque类似列表的容器,实现了在两端快速添加(append)和弹出(pop)。
ChainMap类似字典的容器,将多个映射对象(比如 dict、zip)集合到一个视图里面。
Counter字典的子类,为可哈希对象提供了计数功能。
OrderedDict字典的子类,它具有专门用于重新排列字典顺序的方法。
defaultdict字典的子类,提供了一个工厂函数,为字典查询提供一个默认值。
UserDict封装了字典对象,便于字典子类化。
UserList封装了列表对象,便于列表子类化。
UserString封装了列表对象,便于字符串子类化。
namedtuple() 函数用于根据参数创建一个元组(tuple)的子类。
语法格式:
namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
参数说明:
参数说明
typename类名,字符串。
field_names生成的元组子类初始化方法(__init__)的参数。假设初始化方法有两个参数 x 和 y,那么可以这样表示:
[*]['x', 'y'] # 用列表表示,有两个元素 'x' 和 'y'
[*]'x y' # 用字符串表示,用空格分隔每一个参数
[*]'x, y' # 用字符串表示,用英文半角逗号 , 分隔每一个参数
注意:实例化返回的对象传进的参数是实例的属性,比如初始化方法有两个参数 x 和 y,那么可以这样访问 x 和 y:实例对象.x、实例对象.y
rename如果 rename 为 True,则无效参数名将自动替换为 '_' + str(元素在列表中的索引),例如 ['abc'、'def'、'ghi'、'abc'] 被转换为 ['abc'、'_1'、'ghi'、'_3'],消除了关键字 def 和重复的参数名 abc。
注意:此参数在 Python 3.1 添加。
default参数默认值,可为 None 或可迭代对象。为 None 代表不指定任何默认值。defaults 应用于最右边的参数,例如参数指定为 ['x', 'y', 'z'],默认值指定为 (1, 2),则 x 没有默认值,y 的默认值为 1,z 的默认值为 2。
注意:此参数在 Python 3.7 添加。
module如果指定,则设置生成的元组子类的 __module__ 属性。
注意:此参数在 Python 3.6 添加。
返回值:
NamedTuple 的子类。
方法:
[*](类方法)_make(iterable)
从序列中创建此对象的新实例。
>>> t =
>>> Point._make(t)
Point(x=11, y=22)
[*]_asdict()
返回一个字典,它将参数名称映射到其相应的值。
>>> p = Point(x=11, y=22)
>>> p._asdict()
{'x': 11, 'y': 22}
在 Python 3.1 更改:返回 OrderedDict 类型而不是 dict 类型。
在 Python 3.8 更改:返回 dict 类型而不是 OrderedDict 类型。
[*]_replace(**kwargs)
返回对象的新实例,用新值替换指定参数和属性:
>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22)
属性:
[*]_fields
它是列出参数名称的字符串元组。
>>> p = Point(x=11, y=22)
>>> p._fields # 查看所有参数名
('x', 'y')
[*]_field_defaults
它是参数默认值的字典。
>>> Account = namedtuple('Account', ['type', 'balance'], defaults=)
>>> Account._field_defaults
{'balance': 0}
deque 队列是由栈和 queue 队列生成的。deque 支持线程安全,内存高效添加 (append) 和弹出 (pop)。
语法格式:
deque(])
参数说明:
参数说明
iterable可迭代对象。
maxlen如果 maxlen 没有指定或者是 None,deques 可以增长到任意长度。否则,deque 的长度就限制为指定的最大长度。一旦长度有限制的 deque 满了,当新元素加入时,同样数量的元素就从另一端弹出。
方法:
[*]append(x)
把 x 添加到队列的右端。
[*]appendleft(x)
把 x 添加到队列的左端。
[*]clear()
清除队列的所有元素。
[*]copy()
浅拷贝字典。
注意:此方法在 Python 3.5 添加。
[*]count(x)
计算 deque 中等于 x 的元素个数。
注意:此方法在 Python 3.2 添加。
[*]extend(iterable)
向 deque 的右侧添加 iterable 可迭代对象中的元素。
[*]extendleft(iterable)
向 deque 的左侧添加 iterable 可迭代对象中的元素。
注意:向 deque 的左侧添加时,iterable 可迭代对象将被反过来添加。
[*]index(x[, start[, stop]])
返回第 x 个元素(从 start 开始计算,在 stop 之前),返回第一个匹配。
注意:
如果没找到指定的元素,则抛出 ValueError。
此方法在 Python 3.5 添加。
[*]insert(i, x)
在位置 i 插入 x。
注意:
如果插入会导致一个有长度限制的 deque 超出长度 maxlen 的话,就抛出 IndexError。
此方法在 Python 3.5 添加。
[*]pop()
向 deque 的最右侧删除并返回一个元素。
注意:如果不存在任何元素,就抛出 IndexError。
[*]popleft()
向 deque 的最左侧删除并返回一个元素。
注意:如果不存在任何元素,就抛出 IndexError。
[*]remove(value)
删除 value 第一次出现的值。
注意:如果未找到指定的值,则抛出 ValueError。
[*]reverse()
反转 deque。
注意:此方法在 Python 3.2 添加。
[*]rotate(n=1)
向右旋转 deque(把 deque 最右端的元素移动到最左端),执行 n 次。如果 n 为负,则向左旋转。
属性:
[*]maxlen
只读属性,deque 最大长度。
注意:此属性在 Python 3.1 添加。
例子:
>>> from collections import deque
>>> d = deque('ghi') # 用 3 个元素创建一个 deque
>>> for elem in d: # 迭代
print(elem.upper())
G
H
I
>>> d.append('j') # 向 deque 的最右端添加元素 'j'
>>> d.appendleft('f') # 向 deque 的最左端添加元素 'f'
>>> d
deque(['f', 'g', 'h', 'i', 'j'])
>>> d.pop() # 删除并返回 deque 最右侧端的元素
'j'
>>> d.popleft() # 删除并返回 deque 最左端的元素
'f'
>>> list(d)
['g', 'h', 'i']
>>> d # 获取最左端的元素
'g'
>>> d[-1] # 获取最右端的元素
'i'
>>> list(reversed(d)) # 翻转 deque 并转化成列表
['i', 'h', 'g']
>>> 'h' in d # 查找 deque
True
>>> d.extend('jkl')
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> d.rotate(1) # 朝右旋转 deque
>>> d
deque(['l', 'g', 'h', 'i', 'j', 'k'])
>>> d.rotate(-1) # 朝左旋转 deque
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> deque(reversed(d))
deque(['l', 'k', 'j', 'i', 'h', 'g'])
>>> d.clear() # 清空 deque
>>> d.pop() # 不能 pop 一个空 deque
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
d.pop() # 不能 pop 一个空 deque
IndexError: pop from an empty deque
>>> d.extendleft('abc')
>>> d
deque(['c', 'b', 'a'])
ChainMap 用于将多个字典或者其他映射对象组合在一起,创建一个单独的映射对象。
语法格式:
ChainMap(*maps)
参数说明:
参数说明
maps映射对象。
方法:
[*]new_child(m=None)
返回一个添加了映射对象 m 的 ChainMap 类(在新的 ChainMap 类中,m 映射对象排在第一位)。如果 m 为 None,则 m 被替换成空字典。
注意:m 参数在 Python 3.5 设置成了可选参数。
属性:
[*]maps
ChainMap 的映射列表。
[*]parents
删除了 ChainMap 第一个元素的 ChainMap 对象。
例子:
>>> from collections import ChainMap
>>> d = ChainMap({1: 2, 3: 4}, {5: 6, 7: 8}) # 创建一个 ChainMap 对象
>>> d.new_child(zip(, ))
ChainMap(<zip object at 0x03415800>, {1: 2, 3: 4}, {5: 6, 7: 8})
>>> dict(d) # 转化为字典
{5: 6, 7: 8, 1: 2, 3: 4}
>>> d.maps
[{1: 2, 3: 4}, {5: 6, 7: 8}]
>>> d.parents
ChainMap({5: 6, 7: 8})
Counter 是 dict 的子类,用于统计可哈希对象的数量。
语法格式:
Counter(iterable, **kwds)
参数说明:
参数说明
iterable用于计数元素的可迭代对象。
kwds映射对象,在后面会有例子说明。
方法:
[*]elements()
返回迭代器,每个元素将会出现 Counter 内部计数值。如果一个元素的计数值小于 1,执行该方法将会忽略它。
[*]most_common()
返回列表,其中包含 n 个出现次数最多的元素及出现次数,按出现次数由高到低排序。如果不指定 n,将返回 Counter 所有的元素及出现次数。
[*]subtract()
将 Counter 与 n 相减(原来的 Counter 减去 n 元素出现次数的数量)。
注意:此方法在 Python 3.2 添加。
[*]update(n)
将 Counter 与 n 相加(原来的 Counter 加上 n 元素出现次数的数量)。
例子:
>>> from collections import Counter
>>> Counter() # 空计数器
Counter()
>>> Counter({'a': 1, 'b': 2, 'c': 3}) # 根据字典创建计数器
Counter({'c': 3, 'b': 2, 'a': 1})
>>> Counter(a=1, b=2, c=3) # 根据关键字参数创建计数器
Counter({'c': 3, 'b': 2, 'a': 1})
>>> cnt = Counter()
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt += 1
>>> cnt
Counter({'blue': 3, 'red': 2, 'green': 1})
>>> c = Counter(['eggs', 'ham'])
>>> c['bacon'] # 在 Counter 中没有的元素的计数为零
0
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> sorted(c.elements()) # a=4 在 Counter 中被解释为 a 出现了 4 次
['a', 'a', 'a', 'a', 'b', 'b']
>>> Counter('abracadabra').most_common(3) # 返回出现次数最多的前三个元素
[('a', 5), ('b', 2), ('r', 2)]
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> d = Counter(a=1, b=2, c=3, d=4)
>>> c.subtract(d) # 将 c 与 d 相减
>>> c
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d # 相加
Counter({'a': 4, 'b': 3})
>>> c - d # 相减(只保留出现次数为正数的元素)
Counter({'a': 2})
>>> c & d # 交集:min(c, d)
Counter({'a': 1, 'b': 1})
>>> c | d # 并集:max(c, d)
Counter({'a': 3, 'b': 2})
OrderDict 是 dict 的子类,具有专门用于重新排列字典顺序的方法。
语法格式:
OrderedDict()
参数说明:
参数说明
items元素。与 dict 初始化方法的参数一样。
方法:
[*]popitem(last=True)
与 dict.popitem() 基本相同,如果指定 last 为 True 则从 OrderedDict 的开头移除元素。
[*]move_to_end(key, last=True)
将 OrderedDict 中存在的 key 键移动到字典的左端(如果 last 为 False)或右端(如果 last 为 True)。
注意:此方法在 Python 3.2 添加。
例子:
>>> from collections import OrderedDict
>>> d = OrderedDict(a=5, b=2, c=4, d=1)
>>> d.popitem(False) # 删除左侧的元素
('a', 5)
>>> d
OrderedDict([('b', 2), ('c', 4), ('d', 1)])
>>> d.popitem(True) # 删除右侧的元素
('d', 1)
>>> d
OrderedDict([('b', 2), ('c', 4)])
>>> d = OrderedDict.fromkeys('abcde')
>>> d.move_to_end('b')
>>> ''.join(d.keys())
'acdeb'
>>> d.move_to_end('b', last=False)
>>> ''.join(d.keys())
'bacde'
defaultdict 是 dict 的子类,重写了 __missing__ 方法,当键不存在时返回默认值。
语法格式:
defaultdict(])
参数说明:
参数说明
default_factory一个函数。如果不指定此参数或指定为 None,则 “当键不存在时返回默认值” 这个功能无效。
往后的参数和 dict 初始化的参数相同。
方法:
[*]__missing__(key)
当找不到 key 时调用,返回 default_factory 调用的结果(不传递任何参数)。
注意:__missing__ 只在 __getitem__ 找不到指定的 key 引发,用字典的 get() 会正常返回。
属性:
[*]default_factory
实例化对象时传递的参数 default_factory。
例子:
>>> from collections import defaultdict
>>> d = defaultdict(list, a=1, b=2, c=3, d=4)
>>> d['a']
1
>>> d['e'] # 查询不存在的元素,返回 list()
[]
>>> d.default_factory # 实例属性
<class 'list'>
UserDict 是模拟字典的类。
属性:
[*]data
dict 类型,是 UserDict 初始化时传入的数据。
UserList 是模拟列表的类。
属性:
[*]data
list 类型,是 UserList 初始化时传入的数据。
UserString 是模拟字符串的类。
属性:
[*]data
str 类型,是 UseString 初始化时传入的数据。
注意:
在 Python 3.5 中添加了新的实例方法:__getnewargs__、__rmod__、casefold、format_map、isprintable 和 maketrans。 _2_ 发表于 2019-10-27 16:50
沙发
马上更新完毕{:10_281:} @_2_ @henry2018 @一个账号 更新完成{:10_298:}
@小甲鱼 申精~{:10_256:}{:10_254:} 写作业ing…… zltzlt 发表于 2019-10-27 16:56
@_2_ @henry2018 @一个账号 更新完成
@小甲鱼 申精~
终于写完了{:10_269:} _2_ 发表于 2019-10-27 19:27
终于写完了
因为太长了~ 不错不错!!{:5_102:} 小甲鱼 发表于 2019-10-27 19:55
不错不错!!
谢谢 小甲鱼 发表于 2019-10-27 19:55
不错不错!!
这个搞了很久了 小甲鱼 发表于 2019-10-27 19:55
不错不错!!
正在跟VS Code斗智斗勇......
用VS Code配置C语言开发环境,写了好久的lauch.json
可能系统不太一样,反正能生成可执行文件(.exe)了
好不容易啊!{:10_269:}{:10_250:}
加个好友吧 小甲鱼 发表于 2019-10-27 19:55
不错不错!!
由于时间的关系,我把
C Python JavaScript
放在一起学了 zltzlt 发表于 2019-10-27 16:56
@_2_ @henry2018 @一个账号 更新完成
@小甲鱼 申精~
每天一篇作文,心裂 _2_ 发表于 2019-10-27 20:17
由于时间的关系,我把
C Python JavaScript
放在一起学了
最好先学透一门语言,原来我想一起学,结果全混了,emmmmmmmm................... henry2018 发表于 2019-10-28 19:05
最好先学透一门语言,原来我想一起学,结果全混了,emmmmmmmm...................
肯定有搞混的,比如忘记加分号了(C) 这是一个非常实用的模块,现在有了API以后有很多问题都能解决 _2_ 发表于 2019-10-28 20:41
这是一个非常实用的模块,现在有了API以后有很多问题都能解决
哈哈 zltzlt 发表于 2019-10-28 20:41
哈哈
很有用的东西 _2_ 发表于 2019-10-28 20:34
肯定有搞混的,比如忘记加分号了(C)
感觉还是 Python 简洁,C 语言满屏的大括号,分号,什么 int、double、float(我头都要晕掉) zltzlt 发表于 2019-10-28 20:42
感觉还是 Python 简洁,C 语言满屏的大括号,分号,什么 int、double、float(我头都要晕掉)
但python也是用C来写的呀 _2_ 发表于 2019-10-28 20:48
但python也是用C来写的呀
是,但 Python 更简洁
页:
[1]
2