Python的collections模块有哪些高级数据结构可用?

2026-05-24 17:411阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1312个文字,预计阅读时间需要6分钟。

Python的collections模块有哪些高级数据结构可用?

前言:Python 中内置了 4 种数据类型,包括 list、tuple、set 和 dict。这些数据类型各有特点,但它们的某些特性(例如 dict 无序)在使用过程中可能会产生约束,尤其是在某些使用场景下。

Python 中内置的 4 种数据类型分别为:list、tuple、set 和 dict。

- list(列表):有序、可变,可以存储任意类型的数据。- tuple(元组):有序、不可变,用于存储不可变的数据,例如坐标、日期等。- set(集合):无序、不可变,用于存储不重复的数据,常用于去重、交集等操作。- dict(字典):无序、可变,用于存储键值对,常用于关联数据。

这些数据类型的特点在使用过程中可能会产生约束,例如:

- dict 无序,可能会影响某些对顺序有要求的场景。- set 中不允许存储重复元素,可能需要在插入前进行去重操作。

Python的collections模块有哪些高级数据结构可用?

在某些使用场景下,这些约束可能会导致以下问题:

- 使用 dict 存储数据时,需要注意键的唯一性。- 使用 set 进行去重操作时,需要确保元素可哈希。- 使用 list 和 tuple 时,需要考虑它们的有序性和可变性。

了解这些数据类型的特点和约束,有助于更好地利用 Python 的强大功能。

前言

Python中内置了4种数据类型,包括:list,tuple,set,dict,这些数据类型都有其各自的特点,但是这些特点(比如dict无序)在一定程度上对数据类型的使用产生了约束,在某些使用场景下效率会比较低,比如有时候我们可能需要维护一个有序的字典等情况。

在这种场景下我们可以使用Python内建的collections模块,它包括了很多有用的集合类,合理的使用可以提高我们代码的运行效率。

接下来主要对collections模块中的常用集合类进行介绍,调用collections模块:

from collections import *

defaultdict

dict在使用时,当key值不存在时,直接添加value时会出现错误,使用defaultdict可以很好的规避该错误。

defaultdict是对字典类型的补充,它可以给字典的值设置一个类型,当key不存在时可以自动生成相应类型的value。

例如:

from collections import defaultdict

test_data = (
('cat', 2),
('dog', 5),
('sheep', 3),
('cat', 1),
('sheep', 2)
)

test_data_dict = defaultdict(list)

for name, num in test_data:
test_data_dict[name].append(num)

print(test_data_dict)
print(dict(test_data_dict))

运行结果:

defaultdict(<class 'list'>, {'cat': [2, 1], 'dog': [5], 'sheep': [3, 2]})

{'cat': [2, 1], 'dog': [5], 'sheep': [3, 2]}

orderedDict

在Python3.6之前的字典是无序的,但是有时候我们需要保持字典的有序性,orderDict可以在dict的基础上实现字典的有序性,这里的有序指的是按照字典key插入的顺序来排列,这样就实现了一个先进先出的dict,当容量超出限制时,先删除最早添加的key。

代码示例:

from collections import OrderedDict

original_dict = {'a': 2, 'b': 4, 'c': 5}

print('dict.keys():', original_dict.keys(), type(original_dict.keys()), sep='\t')
print('dict.values():', original_dict.values(), type(original_dict.values()), sep='\t')
print(list(zip(tuple(original_dict.keys()), tuple(original_dict.values()))))

for key, value in original_dict.items():
print(key, value)

ordered_dict = OrderedDict(list(zip(tuple(original_dict.keys()), tuple(original_dict.values()))))
for key, value in ordered_dict.items():
print(key, value)

运行结果:

可以看到orderDict是按照字典创建时的插入顺序来排序。

deque

Python中的list是基于数组实现的,所以,查找容易,但是插入和删除操作时间复杂度较大。

deque就是为了高效实现插入和删除操作的双向列表,适合用于队列和栈,而且线程安全。

list只提供了append/pop方法来从list的尾部插入或者删除元素,deque新增了appendleft/popleft等方法可以更高效的在元素的开头来插入/删除元素。

代码示例:

from collections import deque

d = deque([1, 2, 3, 4, 5])
d.extendleft([0]) # extendleft默认在列表左边新增元素0
print(d, list(d), sep='\t')

d.extend([6, 7]) # extend默认在列表右边新增元素6、7
print(d, list(d), sep='\t')

d.popleft() # popleft默认删除列表左边的一个元素0
print(d, list(d), sep='\t')

运行结果:

可以在列表中进行双向操作元素,十分方便。

Counter

字典子类,为可以哈希的对象计数。

代码示例:

from collections import Counter

test_counter_data = ['cat', 'dog', 'sheep', 'cat', 'dog']
counter_data = Counter()

for item in test_counter_data:
counter_data[item] += 1

print(counter_data, dict(counter_data), sep='\t')

运行结果:

可以实现对一个对象中的元素(上述代码中如列表中的元素)进行计数。

namedtuple

元组子类。

Python中元组的一个重要特征就是元素不可增删改,而查找tuple元素时一般采取索引。

使用namedtuple(typename, field_name)可以命名tuple中的元素,之后便可使用名字来查找tuple中的值,有点类似于字典中的查找。

代码示例:

from collections import namedtuple

animal = namedtuple('animal', 'type age') # 将animal元组(元组中包含type、age两个元素)转换为<class '__main__.animal'>对象
print(animal)

mark = animal(type='dog', age=2) # 为元组tuple中的元素命名

print(mark.type)

运行结果:

使用namedtuple可以提高代码的可读性和文档性。

去期待陌生,去拥抱惊喜。

本文共计1312个文字,预计阅读时间需要6分钟。

Python的collections模块有哪些高级数据结构可用?

前言:Python 中内置了 4 种数据类型,包括 list、tuple、set 和 dict。这些数据类型各有特点,但它们的某些特性(例如 dict 无序)在使用过程中可能会产生约束,尤其是在某些使用场景下。

Python 中内置的 4 种数据类型分别为:list、tuple、set 和 dict。

- list(列表):有序、可变,可以存储任意类型的数据。- tuple(元组):有序、不可变,用于存储不可变的数据,例如坐标、日期等。- set(集合):无序、不可变,用于存储不重复的数据,常用于去重、交集等操作。- dict(字典):无序、可变,用于存储键值对,常用于关联数据。

这些数据类型的特点在使用过程中可能会产生约束,例如:

- dict 无序,可能会影响某些对顺序有要求的场景。- set 中不允许存储重复元素,可能需要在插入前进行去重操作。

Python的collections模块有哪些高级数据结构可用?

在某些使用场景下,这些约束可能会导致以下问题:

- 使用 dict 存储数据时,需要注意键的唯一性。- 使用 set 进行去重操作时,需要确保元素可哈希。- 使用 list 和 tuple 时,需要考虑它们的有序性和可变性。

了解这些数据类型的特点和约束,有助于更好地利用 Python 的强大功能。

前言

Python中内置了4种数据类型,包括:list,tuple,set,dict,这些数据类型都有其各自的特点,但是这些特点(比如dict无序)在一定程度上对数据类型的使用产生了约束,在某些使用场景下效率会比较低,比如有时候我们可能需要维护一个有序的字典等情况。

在这种场景下我们可以使用Python内建的collections模块,它包括了很多有用的集合类,合理的使用可以提高我们代码的运行效率。

接下来主要对collections模块中的常用集合类进行介绍,调用collections模块:

from collections import *

defaultdict

dict在使用时,当key值不存在时,直接添加value时会出现错误,使用defaultdict可以很好的规避该错误。

defaultdict是对字典类型的补充,它可以给字典的值设置一个类型,当key不存在时可以自动生成相应类型的value。

例如:

from collections import defaultdict

test_data = (
('cat', 2),
('dog', 5),
('sheep', 3),
('cat', 1),
('sheep', 2)
)

test_data_dict = defaultdict(list)

for name, num in test_data:
test_data_dict[name].append(num)

print(test_data_dict)
print(dict(test_data_dict))

运行结果:

defaultdict(<class 'list'>, {'cat': [2, 1], 'dog': [5], 'sheep': [3, 2]})

{'cat': [2, 1], 'dog': [5], 'sheep': [3, 2]}

orderedDict

在Python3.6之前的字典是无序的,但是有时候我们需要保持字典的有序性,orderDict可以在dict的基础上实现字典的有序性,这里的有序指的是按照字典key插入的顺序来排列,这样就实现了一个先进先出的dict,当容量超出限制时,先删除最早添加的key。

代码示例:

from collections import OrderedDict

original_dict = {'a': 2, 'b': 4, 'c': 5}

print('dict.keys():', original_dict.keys(), type(original_dict.keys()), sep='\t')
print('dict.values():', original_dict.values(), type(original_dict.values()), sep='\t')
print(list(zip(tuple(original_dict.keys()), tuple(original_dict.values()))))

for key, value in original_dict.items():
print(key, value)

ordered_dict = OrderedDict(list(zip(tuple(original_dict.keys()), tuple(original_dict.values()))))
for key, value in ordered_dict.items():
print(key, value)

运行结果:

可以看到orderDict是按照字典创建时的插入顺序来排序。

deque

Python中的list是基于数组实现的,所以,查找容易,但是插入和删除操作时间复杂度较大。

deque就是为了高效实现插入和删除操作的双向列表,适合用于队列和栈,而且线程安全。

list只提供了append/pop方法来从list的尾部插入或者删除元素,deque新增了appendleft/popleft等方法可以更高效的在元素的开头来插入/删除元素。

代码示例:

from collections import deque

d = deque([1, 2, 3, 4, 5])
d.extendleft([0]) # extendleft默认在列表左边新增元素0
print(d, list(d), sep='\t')

d.extend([6, 7]) # extend默认在列表右边新增元素6、7
print(d, list(d), sep='\t')

d.popleft() # popleft默认删除列表左边的一个元素0
print(d, list(d), sep='\t')

运行结果:

可以在列表中进行双向操作元素,十分方便。

Counter

字典子类,为可以哈希的对象计数。

代码示例:

from collections import Counter

test_counter_data = ['cat', 'dog', 'sheep', 'cat', 'dog']
counter_data = Counter()

for item in test_counter_data:
counter_data[item] += 1

print(counter_data, dict(counter_data), sep='\t')

运行结果:

可以实现对一个对象中的元素(上述代码中如列表中的元素)进行计数。

namedtuple

元组子类。

Python中元组的一个重要特征就是元素不可增删改,而查找tuple元素时一般采取索引。

使用namedtuple(typename, field_name)可以命名tuple中的元素,之后便可使用名字来查找tuple中的值,有点类似于字典中的查找。

代码示例:

from collections import namedtuple

animal = namedtuple('animal', 'type age') # 将animal元组(元组中包含type、age两个元素)转换为<class '__main__.animal'>对象
print(animal)

mark = animal(type='dog', age=2) # 为元组tuple中的元素命名

print(mark.type)

运行结果:

使用namedtuple可以提高代码的可读性和文档性。

去期待陌生,去拥抱惊喜。