详细分析Python collections工具库

1. 概述

Python中提供了很多常用的工具库,其中collections是比较常用的一个库,它提供了一系列的容器类型,比如:字典、双端队列、有序字典、默认字典等。这些容器类型的使用可以大大方便我们的编程过程,提高代码的效率,缩短开发时间。

2. defaultdict(默认字典)

2.1 简介

Python中默认字典可以在字典中访问一个不存在的键值而不产生KeyError的错误。我们只需要在初始化字典时将defaultdict的一个参数设为一个默认值即可。

2.2 代码示例

from collections import defaultdict

# 定义默认字典

my_dict = defaultdict(int)

# 给默认字典my_dict设置默认值1

print(my_dict['one']) # 输出0

# 给默认字典my_dict设置默认值2

print(my_dict['two']) # 输出0

上述代码中,我们定义了一个默认字典my_dict,同时设定其默认值为int类型的0。在输出my_dict['one']和my_dict['two']时,即使这两个键在字典中没有定义,也可以打印出默认值0。

3. Counter(计数器)

3.1 简介

Counter是一个容器,可以统计(计数)我们需要的对象。例如,我们可以使用Counter来统计一个字符串(或列表、元组)中每个字符(或元素)出现的次数。

3.2 代码示例

from collections import Counter

my_string = 'abracadabra'

my_counter = Counter(my_string)

print(my_counter)

'''

输出:

Counter({'a': 5, 'r': 2, 'b': 2, 'c': 1, 'd': 1})

'''

在上面的代码中,我们定义了一个字符串my_string,通过Counter函数我们可以轻松统计出字符串中每个字符出现的次数。

4. deque(双端队列)

4.1 简介

deque是Python中的双端队列,可以从两端操作队列。它具有以下优点:可以在队列的两端进行快速的插入、删除操作,而且效率高。

4.2 代码示例

from collections import deque

# 创建队列,并添加元素(在队列右端添加)

my_deque = deque()

my_deque.append(1)

my_deque.append(2)

my_deque.append(3)

print(my_deque) # 输出deque([1, 2, 3])

# 在队列左端添加元素

my_deque.appendleft(4)

print(my_deque) # 输出deque([4, 1, 2, 3])

# 在队列右端弹出元素

my_deque.pop()

print(my_deque) # 输出deque([4, 1, 2])

# 在队列左端弹出元素,并返回弹出的元素

print(my_deque.popleft()) # 输出4

在上面的代码中,我们先创建了一个空的队列my_deque,接着使用append方法在队列右端添加3个元素1、2、3,然后使用appendleft方法在队列左端添加一个元素4。接着我们使用pop方法弹出队列最右边的元素3,并打印队列my_deque,队列中的元素变为了[4, 1, 2]。最后我们使用popleft方法弹出队列最左边的元素4,并返回弹出的元素。

5. OrderedDict(有序字典)

5.1 简介

如果想要字典中的键有序排列,可以使用Python中的OrderedDict。OrderedDict将字典中的键按照插入的顺序进行排列,该特性用于保存数据的插入和迭代顺序时很有用的。

5.2 代码示例

from collections import OrderedDict

my_dict = OrderedDict()

my_dict['apple'] = 1

my_dict['banana'] = 2

my_dict['orange'] = 3

print(my_dict)

# 反转字典

new_dict = OrderedDict(reversed(list(my_dict.items())))

print(new_dict)

在上面的代码中,我们首先定义了一个空的OrderedDict类型的字典my_dict,通过添加键值对的方式,将三个水果“apple”、“banana”和“orange”添加到字典中。由于OrderedDict的特性,这三个键的顺序即为插入顺序(带有键值对的添加顺序)。最后我们使用reversed方法将字典my_dict中的元素顺序反转,转化成new_dict字典。

6. namedtuple(命名元组)

6.1 简介

namedtuple是Python中一种很好的数据结构,它可以使我们的元组内容具有可读性,比如,一般的元组中必须通过数字索引来访问元素,而namedtuple通过方便的属性访问,能够提高代码的可读性。

6.2 代码示例

from collections import namedtuple

# 定义命名元组

Pet = namedtuple('Pet', ['name', 'age', 'species'])

# 创建命名元组的实例

my_pet = Pet('Tom', 2, 'cat')

print(my_pet) # 输出Pet(name='Tom', age=2, species='cat')

# 访问元组属性

print(my_pet.name) # 输出Tom

在上述代码中,我们首先使用namedtuple定义了一个Pet命名元组,该元组包含三个属性:name、age以及species。接着我们创建了一份my_pet实例,并输出使用Pet产生的可读性较高的它的属性。

7. defaultdict、Counter、deque、OrderedDict、namedtuple方法的应用

在Python中collections库提供了一批非常好用的容器类型。这些容器类型在处理数据时,可以提高编程效率,同时减少编码过程中的出错概率。

除此之外,collections库中默认字典(defaultdict)、计数器(Counter)、双端队列(deque)、有序字典(OrderedDict)和命名元组(namedtuple)这五种容器类型,都具有很好的组合使用效应。

7.1 代码示例

例如,我们在统计一个列表中各元素出现次数的同时,显示出出现次数最多的前五个元素和对应的出现次数。

from collections import defaultdict, Counter, deque, OrderedDict, namedtuple

my_list = [1, 2, 3, 1, 2, 3, 4, 5, 4, 3]

# 统计元素出现次数,并保存在字典中

my_dict = defaultdict(int)

for ele in my_list:

my_dict[ele] += 1

# 对字典按照次数排序

my_dict = OrderedDict(sorted(my_dict.items(), key=lambda x: x[1], reverse=True))

# 打印出现次数最多的前5个元素和对应的出现次数

print('前5出现次数最多的元素:')

print('{:<10} {}'.format('Element', 'Count'))

print('-' * 20)

for ele, cnt in list(my_dict.items())[0:5]:

print('{:<10} {}'.format(ele, cnt))

'''

输出:

前5出现次数最多的元素:

Element Count

--------------------

3 3

1 2

2 2

4 2

5 1

'''

在这个示例中,我们首先定义了一个初始列表my_list,然后通过defaultdict容器将每个元素出现的次数进行了统计,得到了一个名为my_dict的字典。接着我们使用OrderedDict容器,对my_dict中的元素进行了按照值排序的操作,并打印前五个出现次数最多的元素和对应的出现次数。

8. 总结

使用Python中的collections库可以大大地提高我们的编写效率,而且这些容器类型之间可以进行组合使用,进一步加强容器类型的处理能力。在实际编程过程中,应该根据具体的需求选择合适的容器类型,尽可能地提高代码的可读性、易用性。

后端开发标签