发 帖  
原厂入驻New
[问答]

一文详解pythoncollections模块

49 pythoncollections
分享
2020-11-5 07:54:08   评论 分享淘帖 邀请回答
4个回答
collections模块
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
2020-11-5 16:35:15 评论

举报

  namedtuple(具名元组)
  因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以在这里引入了 collections.namedtuple 这个工厂函数,来构造一个带字段名的元组。具名元组的实例和普通元组消耗的内存一样多,因为字段名都被存在对应的类里面。这个类跟普通的对象实例比起来也要小一些,因为 Python 不会用 __dict__ 来存放这些实例的属性。
  namedtuple 对象的定义如以下格式:
  collections.namedtuple(typename, field_names, verbose=False, rename=False) 返回一个具名元组子类 typename,其中参数的意义如下:
  typename:元组名称
  field_names: 元组中元素的名称
  rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
  verbose: 默认就好
  下面来看看声明一个具名元组及其实例化的方法:
  《img /》《img /》 from collections import namedtuple # 两种方法来给 namedtuple 定义方法名 #User = namedtuple(‘User’, [‘name’, ‘age’, ‘id’]) User = namedtuple(‘User’, ‘name age id’) user = User(‘tester’, ‘22’, ‘464643123’) print(user) #输出结果 User(name=‘tester’, age=‘22’, id=‘464643123’)
  View Code
  collections.namedtuple(‘User’, ‘name age id’) 创建一个具名元组,需要两个参数,一个是类名,另一个是类的各个字段名。后者可以是有多个字符串组成的可迭代对象,或者是有空格分隔开的字段名组成的字符串(比如本示例)。具名元组可以通过字段名或者位置来获取一个字段的信息。
  具名元组的特有属性:
  类属性 _fields:包含这个类所有字段名的元组
  类方法 _make(iterable):接受一个可迭代对象来生产这个类的实例
  实例方法 _asdict():把具名元组以 collections.OrdereDict 的形式返回,可以利用它来把元组里的信息友好的展示出来
  《img /》《img /》 from collections import namedtuple # 定义一个namedtuple类型User,并包含name,sex和age属性。 User = namedtuple(‘User’, [‘name’, ‘sex’, ‘age’]) # 创建一个User对象 user = User(name=‘Runoob’, sex=‘male’, age=12) # 获取所有字段名 print( user._fields ) # 也可以通过一个list来创建一个User对象,这里注意需要使用“_make”方法 user = User._make([‘Runoob’, ‘male’, 12]) print( user ) # User(name=‘user1’, sex=‘male’, age=12) # 获取用户的属性 print( user.name ) print( user.sex ) print( user.age ) # 修改对象属性,注意要使用“_replace”方法 user = user._replace(age=22) print( user ) # User(name=‘user1’, sex=‘male’, age=21) # 将User对象转换成字典,注意要使用“_asdict” print( user._asdict() ) # OrderedDict([(‘name’, ‘Runoob’), (‘sex’, ‘male’), (‘age’, 22)]) #以上实例输出结果为: (‘name’, ‘sex’, ‘age’) User(name=‘Runoob’, sex=‘male’, age=12) Runoob male 12 User(name=‘Runoob’, sex=‘male’, age=22) OrderedDict([(‘name’, ‘Runoob’), (‘sex’, ‘male’), (‘age’, 22)])
  具名元祖的特有属性
2020-11-5 16:35:32 评论

举报

deque(双向列表)
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
<img   /><img    />  1.创建deque序列:  from collections import deque  d=deque()  2.deque提供了类似list的操作方法:  d=deque()  d.append(3)  d.append(8)  d.append(1)  那么此时d=deque([3,8,1]),len(d)=3,d[0]=3,d[-1]=1  3.两端都使用pop:  d=deque(‘12345’)  那么d=deque([&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;])  d.pop()抛出的是’5’,d.leftpop()抛出的是’1’,可见默认pop()抛出的是最后一个元素。  #4.限制deque的长度  d=deque(maxlen=20)  for i in range(30):      d.append(str(i))  #此时d的值为d=deque([&#39;10&#39;, &#39;11&#39;, &#39;12&#39;, &#39;13&#39;, &#39;14&#39;, &#39;15&#39;, &#39;16&#39;, &#39;17&#39;, &#39;18&#39;, &#39;19&#39;, &#39;20&#39;, &#39;21&#39;, &#39;22&#39;, &#39;23&#39;, &#39;24&#39;, &#39;25&#39;, &#39;26&#39;, &#39;27&#39;, &#39;28&#39;, &#39;29&#39;], maxlen=20),可见当限制长度的deque增加超过限制数的项时,另一边的项会自动删除。  #5.添加list各项到deque中:  d=deque([1,2,3,4,5])  d.extend([0])  #那么此时d=deque([1,2,3,4,5,0])  d.extendleft([6,7,8])  #此时d=deque([8, 7, 6, 1, 2, 3, 4, 5, 0])
deque 列表操作
2020-11-5 16:35:45 评论

举报

OrderedDict(有序字典)
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
<img   /><img    />  from collections import OrderedDict d = dict([(&#39;a&#39;, 1), (&#39;b&#39;, 2), (&#39;c&#39;, 3)]) print(d) # dict的Key是无序的 #输出 {&#39;a&#39;: 1, &#39;c&#39;: 3, &#39;b&#39;: 2}  od = OrderedDict([(&#39;a&#39;, 1), (&#39;b&#39;, 2), (&#39;c&#39;, 3)]) print(od) # OrderedDict的Key是有序的 #输出 OrderedDict([(&#39;a&#39;, 1), (&#39;b&#39;, 2), (&#39;c&#39;, 3)])
OrderedDict
2020-11-5 16:35:55 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表