[每日一题]36、内置模块collections的用法

Python Every Day, 第 36 期


collections是Python内建的一个集合模块,提供了许多有用的集合类。

常用的有
  • defaultdict
  • OrderedDict
  • Counter
  • namedtuple
  • deque
  • ChainMap

defaultdict

defaultdict是dict(字典)的一个子类,dict支持的功能defaultdict基本也都支持。 在使用dict时,去访问一个不存在的key时,
会引发KeyError异常。 而defaultdict中每个key都会有一个默认值,因此不会引发KeyError异常。
defaultdict接受一个工厂函数作为参数,工厂函数可以是str、int、list、set、tuple、dict等等。 当key不存在时,返回工厂函数的默认值,如str对应的为空字符串,int对应的为0,list对应的为[]
from collections import defaultdict

dict_1 = defaultdict(int)
dict_1['a'] = 1
print(dict_1) # defaultdict(<class 'int'>, {'a': 1})
print(dict_1['a']) # 'a'是一个存在的key,返回1
print(dict_1['b']) # 'b'不存在这个key,因此返回int的默认值0

dict_2 = defaultdict(list)
dict_2['name'] = 'geek_python'
print(dict_2) # defaultdict(<class 'list'>, {'name': 'geek_python'})
print(dict_2['hobby']) # []

OrderedDict

在Python3.6版本之前,字典中元素的顺序并不是我们有序的,因此如果需要保留添加元素的顺序需要使用OrderedDict。 (3.6之后的版本dict有变得有序了。 )
主要用法如下:
from collections import OrderedDict

# # 定义OrderedDict 方法1
temp = OrderedDict()
temp['name'] = 'geek_python'
print(temp) # OrderedDict([('name', 'geek_python')])

# 定义OrderedDict 方法2
temp = OrderedDict(name='geek_python', age=19)
print(temp) # OrderedDict([('name', 'geek_python'), ('age', 19)])

# 将name元素移动到最后(最右边)
temp.move_to_end('name')
print(temp) # OrderedDict([('age', 19), ('name', 'geek_python')])
# 将key=name的元素移动到最左边
temp.move_to_end('name', last=False)
print(temp.keys()) # odict_keys(['name', 'age'])


# 弹出从右边数第一个k
print(temp.popitem()[0]) # age
# 弹出并返回最左边的key
print(temp.popitem(last=False)[0]) # name

# 遍历
for k, v in temp.items():
    print(k, v)

Counter

Counter用于追踪值的出现次数。 继承dict类,它可以使用dict中的所有方法
from collections import Counter

temp = Counter('aaabcddeee')
print(temp)  # Counter({'a': 3, 'e': 3, 'd': 2, 'b': 1, 'c': 1})

temp = Counter(['a', 'a', 'c', 'd'])
print(temp)  # Counter({'a': 2, 'c': 1, 'd': 1})

# 新增元素
temp.update(['d', 'f'])
print(temp)  # Counter({'a': 2, 'd': 2, 'c': 1, 'f': 1})

# 剔除元素
temp.subtract(['c'])
print(temp)  # Counter({'a': 2, 'd': 2, 'f': 1, 'c': 0})

namedTuple

tuple是一个常用的数据类型,类似列表,区别在于创建之后不能修改元素的值。 访问元素只能通过索引去访问。
namedtuple是tuple的加强版,访问元素可以不通过索引去访问,而是像字典那样通过指定的名字去访问,当然它对应的值也是不能修改的
from collections import namedtuple

# 定义一个namedtuple的User,包含name、age、sex属性
User = namedtuple('User', ['name', 'age', 'sex'])

# 创建user对象
user = User(name='Tom', age=19, sex='M')
# 也可以通过_make 进行创建
# user = User._make(['LiMing', 20, 'M'])
# print(user) # User(name='LiMing', age=20, sex='M')

# 返回所有字段名
print(user._fields) # ('name', 'age', 'sex')
# 获取属性
print(user.name) # Tom

# 转换成字典
print(user._asdict()) # OrderedDict([('name', 'Tom'), ('age', 19), ('sex', 'M')])

deque

deque提供了两端都可以操作的序列,意味着,在序列的前后你都可以执行添加或删除操作。
from collections import deque

# 创建一个双向队列,maxlen为最大长度。默认为无限制
temp = deque(['a', 'b'], maxlen=10)
print(temp)  # deque(['a', 'b'])
# 右边添加
temp.append('c')  # deque('a', 'b', 'c'])
# 左边添加
temp.appendleft('z')  # deque(['z', 'a', 'b', 'c'])
# 右边添加可迭代对象中的元素
temp.extend(['d', 'e'])  # deque(['z', 'a', 'b', 'c', 'd', 'e'])
# 左边添加可迭代对象中的元素
temp.extendleft(('m', 'n'))  # deque(['n', 'm', 'z', 'a', 'b', 'c', 'd', 'e'])
# 移除最右边的元素
print(temp.pop())   # e
# temp.popleft()

print(temp.index('a', 0, 5)) # 在索引0~5的范围内,找到'a'元素的索引位置  3

# 移除第一个'a'元素, 元素不存在抛出valueError异常
temp.remove('a')
# 逆序排序
temp.reverse()
# 清空
temp.clear()


以上,便是今天的分享,希望大家喜欢,觉得内容不错的,欢迎点击「在看」支持,谢谢各位。

如需查看更多[Python Every Day]系列,请点击我的主页的【每日一题】菜单。
640?


感谢您的阅读

640?wx_fmt=gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值