每日一模块-collections

Python的collections模块提供了很多高级的数据结构,使得我们在处理数据时能够更加方便和高效。下面我们将详细讲解collections模块中各个类的功能,并给出相应的样例。

  1. 导入模块
    首先,我们需要导入collections模块:

import collections
2. Counter
Counter是一个字典子类,用于计数可哈希对象。这里我们用它来统计各国出现的次数。

from collections import Counter

一个包含各国名称的列表

countries = ['China', 'USA', 'India', 'China', 'Brazil', 'USA', 'India', 'Russia', 'China']

使用Counter来统计每个国家出现的次数

country_counts = Counter(countries)

打印统计结果

print(country_counts)

输出可能是:Counter({'China': 3, 'USA': 2, 'India': 2, 'Brazil': 1, 'Russia': 1})

找出出现次数最多的国家

most_common_country = country_counts.most_common(1)
print(most_common_country)

输出可能是:[('China', 3)]

计算两个Counter的合并

other_countries = ['Japan', 'Germany', 'USA', 'China']
other_counts = Counter(other_countries)
combined_counts = country_counts + other_counts
print(combined_counts)

输出可能是:Counter({'China': 4, 'USA': 3, 'India': 2, 'Brazil': 1, 'Russia': 1, 'Japan': 1, 'Germany': 1})

从一个Counter中减去另一个Counter

country_counts -= Counter(['India', 'Brazil'])
print(country_counts)

输出可能是:Counter({'China': 3, 'USA': 2, 'Russia': 1})

  1. deque
    deque是一个双端队列,支持从两端添加和删除元素。

from collections import deque

创建一个deque对象

d = deque()
d.append('China')
d.append('USA')
d.appendleft('India')

print(d) # 输出:deque(['India', 'China', 'USA'])

从右端弹出元素

print(d.pop()) # 输出:'USA'

从左端弹出元素

print(d.popleft()) # 输出:'India'
4. defaultdict
defaultdict是一个字典子类,提供了默认值。

from collections import defaultdict

创建一个使用list作为默认值的defaultdict

dd = defaultdict(list)
dd['Asia'].append('China')
dd['Asia'].append('India')
dd['America'].append('USA')

print(dd) # 输出:defaultdict(<class 'list'>, {'Asia': ['China', 'India'], 'America': ['USA']})

创建一个使用int作为默认值的defaultdict

dd_int = defaultdict(int)
print(dd_int['Europe']) # 输出:0
5. namedtuple
namedtuple用于创建一个简单的类,用于存储具有固定字段的数据。

from collections import namedtuple

创建一个名为Country的namedtuple,包含name和population两个字段

Country = namedtuple('Country', ['name', 'population'])

创建一个Country对象

china = Country(name='China', population=1400000000)

访问字段

print(china.name) # 输出:'China'
print(china.population) # 输出:1400000000
非常抱歉,确实没有写完。下面是OrderedDict和ChainMap的完整样例,以及collections模块的总结。

  1. OrderedDict
    OrderedDict是一个保持元素插入顺序的字典。

from collections import OrderedDict

创建一个OrderedDict对象

od = OrderedDict()
od['Asia'] = ['China', 'India']
od['America'] = ['USA', 'Brazil']
od['Europe'] = ['Russia', 'Germany']

遍历有序字典

for continent, countries in od.items():
print(continent, countries)

输出可能是:

Asia ['China', 'India']

America ['USA', 'Brazil']

Europe ['Russia', 'Germany']

移动元素到开头

od.move_to_end('Asia', last=False)
print(od) # 输出:OrderedDict([('Asia', ['China', 'India']), ('America', ['USA', 'Brazil']), ('Europe', ['Russia', 'Germany'])])

弹出元素

popped_item = od.popitem(last=False)
print(popped_item) # 输出可能是:('Asia', ['China', 'India'])
print(od) # 输出:OrderedDict([('America', ['USA', 'Brazil']), ('Europe', ['Russia', 'Germany'])])
7. ChainMap
ChainMap用于创建一个包含多个字典的单一视图,可以在多个字典中查找键。

from collections import ChainMap

创建两个字典

dict1 = {'China': 'Asia', 'USA': 'America'}
dict2 = {'India': 'Asia', 'Brazil': 'America', 'Russia': 'Europe'}

使用ChainMap合并这两个字典

chained_dict = ChainMap(dict1, dict2)

访问键

print(chained_dict['China']) # 输出:'Asia' (优先从dict1中查找)
print(chained_dict['India']) # 输出:'Asia' (从dict1中未找到,则从dict2中查找)
print(chained_dict['Russia']) # 输出:'Europe' (只在dict2中找到)

修改ChainMap中的值

chained_dict['China'] = 'New Asia'
print(chained_dict['China']) # 输出:'New Asia'

添加新值

chained_dict['Japan'] = 'Asia'
print(chained_dict['Japan']) # 输出:'Asia'

链中的字典可以动态变化

new_dict = {'Australia': 'Oceania'}
chained_dict.maps.append(new_dict)
print(chained_dict['Australia']) # 输出:'Oceania'
collections模块总结
collections模块为Python提供了许多有用的数据结构,这些数据结构扩展了Python内置的数据类型,使得处理复杂数据更加高效和方便。

• Counter:用于计数可哈希对象,返回一个字典,键是元素,值是计数。
• deque:双端队列,支持从两端添加和删除元素,适用于需要频繁在两端进行操作的场景。
• defaultdict:带有默认值的字典,当访问字典中不存在的键时,返回默认值,而不是引发错误。
• namedtuple:用于创建一个简单的类,用于存储具有固定字段的数据,比直接使用字典更节省空间。
• OrderedDict:保持元素插入顺序的字典,可以记住元素添加的顺序。
• ChainMap:创建一个包含多个字典的单一视图,可以在多个字典中查找键,并按顺序访问它们。
这些数据结构在特定应用场景中提供了更加高效和直观的处理方式,是Python程序员处理复杂数据的强大工具。根据具体需求,可以选择合适的数据结构来优化代码。

posted @ 2024-04-18 14:59  Alive_2020  阅读(3)  评论(0编辑  收藏  举报