聊聊Python的一个内置模块Collections(Python内置模块Collections详解:高效数据结构全掌握)

原创
ithorizon 6个月前 (10-20) 阅读数 20 #后端开发

Python内置模块Collections详解:高效数据结构全掌握

一、简介

Python的内置模块Collections提供了许多特殊的高效数据结构,这些数据结构在处理数据时可以大大节约性能。本文将详细介绍Collections模块中的各种数据结构及其用法。

二、Counter

Counter是一个字典子类,用于计数可哈希对象。它是一个集合,其中元素存储为字典的键,它们的计数存储为字典的值。

from collections import Counter

# 示例

words = 'hello world hello world hello'.split()

counter = Counter(words)

print(counter)

# 输出:Counter({'hello': 3, 'world': 2})

Counter类提供了以下方法和属性:

  • elements():返回一个迭代器,包含所有元素,每个元素重复它的计数次数。
  • most_common([n]):返回一个列表,包含最常见的元素及其计数,按计数降序排列。如果指定n,则返回前n个最常见的元素。
  • subtract([iterable-or-mapping]):从计数器中减去输入的可迭代对象或映射中的元素。

三、defaultdict

defaultdict是另一个字典子类,它为字典中的每个新键自动分配一个默认值。当你尝试访问字典中不存在的键时,它会自动创建该键并将其值设为默认值。

from collections import defaultdict

# 示例

d = defaultdict(int)

d['a'] += 1

d['b'] += 2

print(d)

# 输出:defaultdict(, {'a': 1, 'b': 2})

defaultdict赞成的默认工厂函数包括:

  • int:默认值为0
  • str:默认值为空字符串
  • list:默认值为空列表
  • set:默认值为空集合
  • dict:默认值为空字典

四、OrderedDict

OrderedDict是一个字典子类,它维护了元素添加的顺序。这意味着当你迭代OrderedDict时,元素的顺序将与它们被添加的顺序相同。

from collections import OrderedDict

# 示例

d = OrderedDict()

d['a'] = 1

d['b'] = 2

d['c'] = 3

print(d)

# 输出:OrderedDict([('a', 1), ('b', 2), ('c', 3)])

OrderedDict在Python 3.7+中已经被内置的dict所取代,后者也保证了元素的插入顺序。

五、ChainMap

ChainMap是一个字典类,用于将多个映射对象链接在一起,形成一个逻辑上的映射对象。它用于处理多个字典的并集。

from collections import ChainMap

# 示例

a = {'a': 1, 'b': 2}

b = {'b': 3, 'c': 4}

c = ChainMap(a, b)

print(c['a']) # 输出:1

print(c['b']) # 输出:2

print(c['c']) # 输出:4

ChainMap提供了以下方法和属性:

  • maps:返回一个包含所有映射对象的列表。
  • new_child():返回一个新的ChainMap对象,包含当前映射对象的副本。

六、Counter

Counter是一个计数工具,用于敏捷计数可哈希对象。Counter本质上是一个字典,键为元素,值为计数。

from collections import Counter

# 示例

c = Counter('hello world')

print(c)

# 输出:Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1})

Counter提供了以下方法和属性:

  • elements():返回一个迭代器,包含所有元素,每个元素重复它的计数次数。
  • most_common([n]):返回一个列表,包含最常见的元素及其计数,按计数降序排列。
  • subtract([iterable-or-mapping]):从计数器中减去输入的可迭代对象或映射中的元素。

七、deque

deque是一个双端队列,赞成在两端敏捷添加(append)和弹出(pop)元素。它提供了类似于列表的接口,但其在两端操作时的时间纷乱度为O(1)。

from collections import deque

# 示例

d = deque(['a', 'b', 'c'])

d.append('d')

print(d) # 输出:deque(['a', 'b', 'c', 'd'])

d.appendleft('z')

print(d) # 输出:deque(['z', 'a', 'b', 'c', 'd'])

d.pop()

print(d) # 输出:deque(['z', 'a', 'b', 'c'])

d.popleft()

print(d) # 输出:deque(['a', 'b', 'c'])

deque提供了以下方法和属性:

  • append(x):在队列的右侧添加一个元素。
  • appendleft(x):在队列的左侧添加一个元素。
  • pop():从队列的右侧移除一个元素并返回它。
  • popleft():从队列的左侧移除一个元素并返回它。
  • rotate(n):旋转队列中的元素。

八、namedtuple

namedtuple是一个工厂函数,用于创建具有命名字段的元组子类。它类似于具有不可变字段的类。

from collections import namedtuple

# 示例

Point = namedtuple('Point', ['x', 'y'])

p = Point(11, y=22)

print(p.x) # 输出:11

print(p.y) # 输出:22

namedtuple提供了以下方法和属性:

  • _fields:包含所有字段名称的元组。
  • _asdict():返回一个具有相同字段名的OrderedDict。
  • _replace(**kwargs):返回一个新的namedtuple实例,替换指定的字段值。

九、递归函数和默认参数

在Collections模块中,一些数据结构如defaultdict和Counter可以与递归函数和默认参数结合使用,以实现更纷乱的数据处理。

from collections import defaultdict

def add_numbers(numbers):

total = 0

for number in numbers:

if isinstance(number, list):

total += add_numbers(number)

else:

total += number

return total

# 示例

numbers = [1, 2, [3, 4, [5, 6]], 7]

print(add_numbers(numbers)) # 输出:28

十、总结

Collections模块为Python开发者提供了一系列高效的数据结构,这些数据结构在处理纷乱的数据时可以大大节约性能。通过掌握这些数据结构,我们可以编写更高效、更简洁的代码。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门