Python 的 collections 模块提供了一些额外的数据类型,这些类型是对Python基本数据类型(如列表、字典、集合、元组)的扩展,用于解决各种特定的问题场景。这个模块是非常有用的工具箱,能够帮助你写出更加简洁和高效的代码。下面是 collections 模块中一些常用数据类型的简介:

描述

  1. Counter

    • 一个计数器工具,用于计数可哈希对象(通常是哈希值不变的对象,如字符串中的字符)。
    • 它是一个字典的子类,其中元素作为键,元素计数作为值。
    • 非常适合于统计数据项数量或频率的场景。
    • 示例:Counter(['apple', 'orange', 'apple']) 会创建一个计数器对象,表示 'apple' 出现了2次,'orange' 出现了1次。
  2. defaultdict

    • 类似于普通的字典,但是它可以为不存在的键提供一个默认值。
    • 避免了在访问字典时键不存在的错误,并且可以简化代码。
    • 示例:defaultdict(int) 创建一个字典,默认值为0。这对于初始化字典中的计数非常有用。
  3. OrderedDict

    • 这是一个字典的子类,它记住了元素被插入时的顺序。
    • Python 3.7+ 的普通字典已经是有序的,但OrderedDict在某些情况下仍然有其特殊用途,比如实现先进先出的字典。
  4. namedtuple

    • 生成可以使用名字来访问元素内容的tuple子类。
    • 它是一种简便的方法,用于创建类似于结构体的对象,而不必写类定义。
    • 适合于创建只有少数属性但没有方法的对象,比如数据库条目。
    • 示例:Person = namedtuple('Person', ['name', 'age']) 创建了一个Person类,可以通过.name.age访问元素。
  5. deque

    • 一个双端队列,可以从头部或尾部高效地添加或删除元素。
    • 它是线程安全的,可以用作栈和队列。
    • 适合于需要快速添加和弹出元素的场景,比如广度优先搜索算法中使用的队列。
  6. 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'])  # 显示第一个找到的值