zltzlt 发表于 2019-10-7 20:12:34

实用干货: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。

zltzlt 发表于 2019-10-27 16:50:52

_2_ 发表于 2019-10-27 16:50
沙发

马上更新完毕{:10_281:}

zltzlt 发表于 2019-10-27 16:56:56

@_2_ @henry2018 @一个账号 更新完成{:10_298:}

@小甲鱼 申精~{:10_256:}{:10_254:}

_2_ 发表于 2019-10-27 16:57:07

写作业ing……

_2_ 发表于 2019-10-27 19:27:09

zltzlt 发表于 2019-10-27 16:56
@_2_ @henry2018 @一个账号 更新完成

@小甲鱼 申精~

终于写完了{:10_269:}

zltzlt 发表于 2019-10-27 19:51:34

_2_ 发表于 2019-10-27 19:27
终于写完了

因为太长了~

小甲鱼 发表于 2019-10-27 19:55:06

不错不错!!{:5_102:}

zltzlt 发表于 2019-10-27 19:58:13

小甲鱼 发表于 2019-10-27 19:55
不错不错!!

谢谢

zltzlt 发表于 2019-10-27 19:58:22

小甲鱼 发表于 2019-10-27 19:55
不错不错!!

这个搞了很久了

_2_ 发表于 2019-10-27 20:03:06

小甲鱼 发表于 2019-10-27 19:55
不错不错!!

正在跟VS Code斗智斗勇......
用VS Code配置C语言开发环境,写了好久的lauch.json
可能系统不太一样,反正能生成可执行文件(.exe)了
好不容易啊!{:10_269:}{:10_250:}
加个好友吧

_2_ 发表于 2019-10-27 20:17:26

小甲鱼 发表于 2019-10-27 19:55
不错不错!!

由于时间的关系,我把
C Python JavaScript
放在一起学了

henry2018 发表于 2019-10-28 19:03:14

zltzlt 发表于 2019-10-27 16:56
@_2_ @henry2018 @一个账号 更新完成

@小甲鱼 申精~

每天一篇作文,心裂

henry2018 发表于 2019-10-28 19:05:10

_2_ 发表于 2019-10-27 20:17
由于时间的关系,我把
C Python JavaScript
放在一起学了

最好先学透一门语言,原来我想一起学,结果全混了,emmmmmmmm...................

_2_ 发表于 2019-10-28 20:34:27

henry2018 发表于 2019-10-28 19:05
最好先学透一门语言,原来我想一起学,结果全混了,emmmmmmmm...................

肯定有搞混的,比如忘记加分号了(C)

_2_ 发表于 2019-10-28 20:41:24

这是一个非常实用的模块,现在有了API以后有很多问题都能解决

zltzlt 发表于 2019-10-28 20:41:44

_2_ 发表于 2019-10-28 20:41
这是一个非常实用的模块,现在有了API以后有很多问题都能解决

哈哈

_2_ 发表于 2019-10-28 20:42:23

zltzlt 发表于 2019-10-28 20:41
哈哈

很有用的东西

zltzlt 发表于 2019-10-28 20:42:35

_2_ 发表于 2019-10-28 20:34
肯定有搞混的,比如忘记加分号了(C)

感觉还是 Python 简洁,C 语言满屏的大括号,分号,什么 int、double、float(我头都要晕掉)

_2_ 发表于 2019-10-28 20:48:18

zltzlt 发表于 2019-10-28 20:42
感觉还是 Python 简洁,C 语言满屏的大括号,分号,什么 int、double、float(我头都要晕掉)

但python也是用C来写的呀

zltzlt 发表于 2019-10-28 20:52:51

_2_ 发表于 2019-10-28 20:48
但python也是用C来写的呀

是,但 Python 更简洁
页: [1] 2
查看完整版本: 实用干货:collections 内置模块中文文档