Python的collections扩展重点内容学习

我一直觉得老老实实看这些文档意义不是很大,重要的应该是通过写项目去熟悉文档内容,通过需求和实践去推动知识的学习.直到我发觉有些知识有什么用,还是过一遍为好.我不知道什么是对的,如果有人看到我写下的字,希望能留言.谢谢.

collections库的主要知识

这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。

开篇就是这句话,这个库内的容器,更加的精准,更加适用于某些场景.

namedtuple

collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

命名元组实例,没有字典,它更加轻量,占用内存更小.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> from collections import *
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, 22)
>>> p[0] + p[1]
33
>>> p['x']
Traceback (most recent call last):
File "<input>", line 1, in <module>
p['x']
TypeError: tuple indices must be integers or slices, not str
>>> a, b = p
>>> a
11
>>> b
22
>>> p.x
11
>>> p
Point(x=11, y=22)

这玩意x和y不是键,而叫域名,getattr(p, ‘x’)可以获取值.

命名元组尤其在csv和sqlite返回的元组这一块非常有用,到时候用到可以参考一下,_make方法.

OrderedDict

有序字典.跟字典的区别重点在于,字典的迭代结果是一致的,因为有序字典是有序的,而默认字典是无序的.并且支持逆序,支出popitem先入先出和先入后出的顺序.

看官网的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])

userDict和UserString和UserList实例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 用户自定义字典类UserDict,它是封装了一个字典类dict。主要使用来拷贝一个字典的数据,而不是共享同一份数据。

>>> d = {'a':2, 'b':23}
>>> dd = UserDict(d)
>>> d
{'a': 2, 'b': 23}
>>> dd
{'a': 2, 'b': 23}
>>> del d['a']
>>> d
{'b': 23}
>>> dd
{'a': 2, 'b': 23}
>>>


# 拷贝了一份字典

# 用户自定义列表类,主要用来给想继承列表的用户,用户又需要自定义一些列表的行为。
>>> l = [1,2,3]
>>> newl = l
>>> ll = UserList(l)
>>> print(l, newl, ll)
[1, 2, 3] [1, 2, 3] [1, 2, 3]
>>> del l[1]
>>> print(l, newl, ll)
[1, 3] [1, 3] [1, 2, 3]
>>>

UserString就不写了,大同小异.Copy对象的时候可以用到

deque

好吧,我现在才发现queue队列的发音是(kill)…

返回一个新的线程安全的双向队列,可迭代.

虽然list也支持类似的操作,但是deque优化了定长操作和pop(0)和insert(0, v)的开销

意味着,如果单单是类似从两端存取,则优于list,而需要中间快速存取,还是list更优.

1
2
3
4
5
6
# 限长deque提供了类似Unix tail 过滤功能

def tail(filename, n=10):
'Return the last n lines of a file'
with open(filename) as f:
return deque(f, n)

这真的非常有趣.
对了,它还支持rotate方法,向左和向右循环x位!

defaultDict

这返回一个类似字典的对象,是内置dict类的子类.当我们做这种带有统计性质的数据操作时候,这个对象很好用。

看例子理解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
>>> def default_factory():
... return 'default_value'
...
>>> d = defaultdict(default_factory, foo = 'aaa')
>>> d
defaultdict(<function default_factory at 0x7f0c5f595950>, {'foo': 'aaa'})
>>> d['foo']
'aaa'
>>> d['aaa']
'default_value'
>>>

# 因此,可以设置默认值,替代了字典中的default_value设置.并且访问一个不存在的值的时候,自动调用默认工厂函数替代

>>> 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])]

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> sorted(d.items())
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]

# 上述两个例子,可以体现出设置默认类型的效果