引言
Python为我们提供了4种基本的数据结构:list,tuple,dict,set,但是当处理数据量较大的时候,这4种数据结构的效率就比较低了。例如向list头部插入数据或者维护一个有序的dict。所以这个时候就要用到Python标准库为我们提供的collection包了,它提供了多个有用的集合类,不仅让我们写出的代码更加Pythonic,也可以提高我们程序的运行效率。
namedtuple
namedtuple(typename, field_name)主要是用来产生可以使用名称来访问元素的数据对象,使程序更具有可读性。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print("{0} and {1}".format(p.x, p.y))
1 and 2
namedtuple用来创建一个自定义的tuple对象,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。
defaultdict
defaultdict(default_factory)在普通的dict之上添加了default_factory,使得key不存在时会自动生成相应的value值,default_factory参数可以指定成list,set,int等各种合法类型。
from collections import defaultdict
members = [
# Sex, name
['male', 'John'],
['male', 'Jack'],
['female', 'Lily'],
['male', 'Pony'],
['female', 'Lucy']
]
people = defaultdict(list)
for sex, name in members:
people[sex].append(name)
people
defaultdict(list,
{'female': ['Lily', 'Lucy'], 'male': ['John', 'Jack', 'Pony']})
# 统计字符串中字符出现的次数
s = "hello world"
d = defaultdict(int)
for k in s:
d[k] += 1
d
defaultdict(int,
{' ': 1, 'd': 1, 'e': 1, 'h': 1, 'l': 3, 'o': 2, 'r': 1, 'w': 1})
OrderedDict
OrderedDict是dict的一个子类,我们在使用dict时,key通常是无序的,而OrderedDict能维护一个有序的字典。
注:此处的有序是指插入的顺序,而不是key值的顺序。
from collections import OrderedDict
d = dict([('a', 1),('c', 5),('d', 2),('b', 4)])
d
{'a': 1, 'b': 4, 'c': 5, 'd': 2}
od = OrderedDict([('a', 1),('c', 5),('d', 2),('b', 4)])
od
OrderedDict([('a', 1), ('c', 5), ('d', 2), ('b', 4)])
example1
使用OrderedDict来让dict变得有序:
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
example2
OrderedDict有两个常用的函数可以对item进行操作:
popitem(last = True):删除最后一个插入的键值对;对应的False删除第一个键值对
move_to_end(key, last = True):将排序好的任意key-value插入到字典的结尾;对应的False则是插入到开头
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
d.popitem()
d
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2)])
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
d.move_to_end('banana')
d
OrderedDict([('apple', 4), ('orange', 2), ('pear', 1), ('banana', 3)])
deque
deque是为了高效实现插入与删除操作的双向列表,相比于list,deque新增了appendleft和popleft两种方法,允许我们直接从开头插入和删除元素
from collections import deque
list1 = deque(['a', 'b', 'c', 'd'])
list1.popleft()
'a'
list1 = deque(['a', 'b', 'c', 'd'])
list1.appendleft('y')
list1
deque(['y', 'a', 'b', 'c', 'd'])
Counter
Counter也是dict的一个子类,可以看做一个计数器,用来统计相关元素出现的个数。
from collections import Counter
cnt = Counter()
for ch in 'hello':
cnt[ch] += 1
cnt
Counter({'e': 1, 'h': 1, 'l': 2, 'o': 1})
# 使用 most_common(n) 返回一个list,包含Counter对象中出现最多的前n个元素
c = Counter('abracadabra')
c
Counter({'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r': 2})
c.most_common(3)
[('a', 5), ('b', 2), ('r', 2)]