Python 的 collections
模块提供了一些额外的数据类型,这些类型是对Python基本数据类型(如列表、字典、集合、元组)的扩展,用于解决各种特定的问题场景。这个模块是非常有用的工具箱,能够帮助你写出更加简洁和高效的代码。下面是 collections
模块中一些常用数据类型的简介:
描述
Counter
:- 一个计数器工具,用于计数可哈希对象(通常是哈希值不变的对象,如字符串中的字符)。
- 它是一个字典的子类,其中元素作为键,元素计数作为值。
- 非常适合于统计数据项数量或频率的场景。
- 示例:
Counter(['apple', 'orange', 'apple'])
会创建一个计数器对象,表示'apple'
出现了2次,'orange'
出现了1次。
defaultdict
:- 类似于普通的字典,但是它可以为不存在的键提供一个默认值。
- 避免了在访问字典时键不存在的错误,并且可以简化代码。
- 示例:
defaultdict(int)
创建一个字典,默认值为0。这对于初始化字典中的计数非常有用。
OrderedDict
:- 这是一个字典的子类,它记住了元素被插入时的顺序。
- Python 3.7+ 的普通字典已经是有序的,但
OrderedDict
在某些情况下仍然有其特殊用途,比如实现先进先出的字典。
namedtuple
:- 生成可以使用名字来访问元素内容的tuple子类。
- 它是一种简便的方法,用于创建类似于结构体的对象,而不必写类定义。
- 适合于创建只有少数属性但没有方法的对象,比如数据库条目。
- 示例:
Person = namedtuple('Person', ['name', 'age'])
创建了一个Person
类,可以通过.name
和.age
访问元素。
deque
:- 一个双端队列,可以从头部或尾部高效地添加或删除元素。
- 它是线程安全的,可以用作栈和队列。
- 适合于需要快速添加和弹出元素的场景,比如广度优先搜索算法中使用的队列。
ChainMap
:- 用于将多个字典或映射合并为一个单一的视图。
- 如果有重复的键,它们将会从第一个找到的映射中返回相应的值。
- 适合于需要将多个字典当作一个单一的映射来处理的场景。
这些数据结构在处理数据和实现特定算法时非常有用。了解并掌握它们,能够让你更加高效地使用Python来解决问题。
代码
from collections import Counter, defaultdict, OrderedDict, namedtuple, deque, ChainMap
# Counter 示例
fruits = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
fruit_counter = Counter(fruits)
print("Counter 示例: 一个计数器工具,用于计数可哈希对象(通常是哈希值不变的对象,如字符串中的字符)。")
print(fruit_counter)
print('')
# defaultdict 示例
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
print("defaultdict 示例: 类似于普通的字典,但是它可以为不存在的键提供一个默认值。")
print(dict(d))
print('')
# OrderedDict 示例
d = OrderedDict()
d['banana'] = 3
d['apple'] = 4
d['pear'] = 1
d['orange'] = 2
print("OrderedDict 示例: 这是一个字典的子类,它记住了元素被插入时的顺序。")
for key, value in d.items():
print(key, value)
print('')
# namedtuple 示例
Person = namedtuple('Person', 'name age')
p = Person('John', 30)
print("namedtuple 示例: 生成可以使用名字来访问元素内容的tuple子类。")
print(p)
print(f'Name: {p.name}, Age: {p.age}')
print('')
# deque 示例
dq = deque(['a', 'b', 'c'])
dq.append('d') # 添加到右边
dq.appendleft('e') # 添加到左边
print("deque 示例: 一个双端队列,可以从头部或尾部高效地添加或删除元素。")
print("After append: ", dq)
dq.pop() # 从右边移除
dq.popleft() # 从左边移除
print("After pop: ", dq)
print('')
# ChainMap 示例
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
chain_map = ChainMap(dict1, dict2)
print("ChainMap 示例: 用于将多个字典或映射合并为一个单一的视图。")
print(chain_map)
print("Accessing value by key 'b':", chain_map['b']) # 显示第一个找到的值