Python的collections
库提供了许多有用的数据结构,这些数据结构是对内建数据类型的补充。以下是一些collections
库中主要数据结构的详细介绍和示例:
-
Counter
Counter
是一个字典子类,用于计数可哈希对象。常用于统计字符出现的次数、列表中元素出现的次数等。示例:
from collections import Counter # 统计字符出现的次数 c = Counter('gallahad') print(c) # 输出:Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1}) # 统计列表中元素出现的次数 lst = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'] c = Counter(lst) print(c) # 输出:Counter({'apple': 3, 'banana': 2, 'orange': 1})
-
defaultdict
defaultdict
是一个字典子类,它覆盖了字典的一个方法以提供一个默认值供字典项查找。当请求的键在字典中不存在时,defaultdict
将使用一个函数自动创建它。示例:
from collections import defaultdict # 当键不存在时,默认值为0 d = defaultdict(int) for k in 'abcd': d[k] += 1 print(d) # 输出:defaultdict(<class 'int'>, {'a': 1, 'b': 1, 'c': 1, 'd': 1})
-
OrderedDict
OrderedDict
是一个字典子类,它保持它的键值对的插入顺序。一个OrderedDict
将记住元素被第一次插入的顺序。如果一个新的元素覆盖了已经存在的键,原始插入位置将保持不变。示例:
from collections import OrderedDict d = OrderedDict() d['first'] = 1 d['second'] = 2 d['third'] = 3 d['last'] = 4 print(d) # 输出顺序和插入顺序相同
-
namedtuple
namedtuple
是一个函数,它生成元组子类,这些子类有命名的字段。就像普通的元组一样,namedtuple
是不可变的。示例:
from collections import namedtuple # 定义一个具有x和y属性的Point类 Point = namedtuple('Point', ['x', 'y']) p = Point(11, y=22) print(p[0] + p[1]) # 输出:33
-
deque
deque
是一个双端队列,它具有线程安全,内存高效的添加(append)和弹出(pop),从两端都可以操作,并且具有有限的长度。示例:
from collections import deque d = deque('ghi') # 输出deque(['g', 'h', 'i']) d.append('j') # 在右边添加一个新元素 d.appendleft('f') # 在左边添加一个新元素 print(d) # 输出:deque(['f', 'g', 'h', 'i', 'j'])
-
ChainMap
ChainMap
是一个字典类,它可以将多个字典看作一个单一字典,实现了一种逻辑上的而非物理上的合并。示例:
from collections import ChainMap d1 = {'a': 1, 'b': 2} d2 = {'b': 2, 'c': 3} d3 = {'c': 3, 'd': 4} # 合并三个字典 d = ChainMap(d1, d2, d3) print(d) # 输出:ChainMap({'a': 1, 'b': 2}, {'b': 2, 'c': 3}, {'c': 3, 'd': 4}) print(d['a']) # 输出:1 print(d['b']) # 输出:2,注意这里的值是第一个找到的b键对应的值 print(d['c']) # 输出:3 print(d['d']) # 输出:4
collections
库中的数据结构功能丰富,为Python提供了更多样化的数据处理能力。上述数据结构都设计得相对简洁和高效,通常能够提供更好的性能和更方便的用法。