Python进阶——容器(Collections)

Python容器包括:

1.defaultdict

与dict类型不同,你不需要检查key是否存在

from collections import defaultdict
colours=(('yasoob','yellow'),('Ali','Blue'))
favorite_colors=defaultdict(list)
for name,colour in colours:
    favorite_colors[name].append(colour)
print(favorite_colors)

输出:defaultdict(<class ‘list’>, {‘yasoob’: [‘yellow’], ‘Ali’: [‘Blue’]})
当你在一个字典中对一个键进⾏嵌套赋值时,如果这个键不存
在,会触发keyError异常。 defaultdict允许我们用一个聪明的方式绕过这个问题。

import collections
import json
tree=lambda:collections.defaultdict(tree)
some_dict=tree()
some_dict['colours']['favorite']="yellow"
print(json.dumps(some_dict))

输出:{“colours”: {“favorite”: “yellow”}}

2.counter

Counter是个计数器,它可以帮助我们针对某项数据进行计数。比如它可以来计算每个
人喜欢多少种颜色:

from collections import Counter
colours=(('yy','yellow'),('aa','blue'),('yy','red'))
favs=Counter(name for name,colour in colours)
print(favs)
输出:Counter({'yy': 2, 'aa': 1})

我们也可以在利用它统计一个文件,例如:

with	open('filename',	'rb')	as	f:
line_count	=	Counter(f)
print(line_count)

3.deque

deque提供了一个双端队列,你可以从头/尾两端添加或删除元素。要想使用它,首先我们
要从collections中导出deque模块:

from collections import deque
d=deque()
d.append('a')
d.append('1')
print(len(d))
print(d[0])
d2=deque(range(5))
d2.popleft()#从左端取出数据
d2.pop()#从右端取出数据
d=deque(maxlen=30) #限制列表大小
d=deque([1,3,4])
d.extendleft([0])从左侧扩展
d.extend([5]) 从右侧扩展

4.namedtuple

您可能已经熟悉元组。
一个元组是一个不可变的列表,你可以存储⼀个数据的序列,它和命名元组
(namedtuples)非常像,但有几个关键的不同。
主要相似点是都不像列表,你不能修改元组中的数据。为了获取元组中的数据,你需要使
用整数作为索引:

from collections import namedtuple
Animal=namedtuple('Animal','name age type six')
perry=Animal(name='pertty',age=33,type='cat',six='man')
print(perry)
输出:Animal(name='pertty', age=33, type='cat', six='man')

现在你可以看到,我们可以用名字来访问namedtuple中的数据。我们再继续分析它。
一个命名元组(namedtuple)有两个必需的参数。它们是元组名称和字段名称。
在上面的例子中,我们的元组名称是Animal,字段名称是’name’,‘age’和’type’。
namedtuple让你的元组变得自文档了。你只要看一眼就很容易理解代码是做什么的。
你也不必使用整数索引来访问一个命名元组,这让你的代码更易于维护。
而且,namedtuple的每个实例没有对象字典,所以它们很轻量,与普通的元组比,并不
需要更多的内存。这使得它们比字典更快。
然而,要记住它是一个元组,属性值在namedtuple中是不可变的,所以下面的代码不能
工作:

perry.age=43
显示错误:AttributeError: can't set attribute

向后兼容于普通元祖,故可以用整数索引:

print(perry[1])
输出:33

也可以将namedtuple转换为dict

print(perry._asdict())
输出:{'name': 'perry', 'age': 33, 'type': 'cat', 'six': 'man'}

5.enum.Enum (包含在Python 3.4以上)
枚举模块:

from enum import Enum
class Species(Enum):
    cat=1
    dog=2
    dragon=3
print(Species(1))
print(Species.cat)
print(Species['cat'])

这三种方法都可访问枚举数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值