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