Python标准库之collections

引言

Python为我们提供了4种基本的数据结构:list,tuple,dict,set,但是当处理数据量较大的时候,这4种数据结构的效率就比较低了。例如向list头部插入数据或者维护一个有序的dict。所以这个时候就要用到Python标准库为我们提供的collection包了,它提供了多个有用的集合类,不仅让我们写出的代码更加Pythonic,也可以提高我们程序的运行效率。

namedtuple

namedtuple(typename, field_name)主要是用来产生可以使用名称来访问元素的数据对象,使程序更具有可读性。

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print("{0} and {1}".format(p.x, p.y))
1 and 2

namedtuple用来创建一个自定义的tuple对象,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

defaultdict

defaultdict(default_factory)在普通的dict之上添加了default_factory,使得key不存在时会自动生成相应的value值,default_factory参数可以指定成list,set,int等各种合法类型。

from collections import defaultdict
members = [
    # Sex, name
    ['male', 'John'],
    ['male', 'Jack'],
    ['female', 'Lily'],
    ['male', 'Pony'],
    ['female', 'Lucy']
]
people = defaultdict(list)
for sex, name in members:
    people[sex].append(name)
people
defaultdict(list,
            {'female': ['Lily', 'Lucy'], 'male': ['John', 'Jack', 'Pony']})
# 统计字符串中字符出现的次数
s = "hello world"
d = defaultdict(int)
for k in s:
    d[k] += 1
d
defaultdict(int,
            {' ': 1, 'd': 1, 'e': 1, 'h': 1, 'l': 3, 'o': 2, 'r': 1, 'w': 1})

OrderedDict

OrderedDict是dict的一个子类,我们在使用dict时,key通常是无序的,而OrderedDict能维护一个有序的字典。
注:此处的有序是指插入的顺序,而不是key值的顺序。

from collections import OrderedDict
d = dict([('a', 1),('c', 5),('d', 2),('b', 4)])
d
{'a': 1, 'b': 4, 'c': 5, 'd': 2}
od = OrderedDict([('a', 1),('c', 5),('d', 2),('b', 4)])
od
OrderedDict([('a', 1), ('c', 5), ('d', 2), ('b', 4)])
example1

使用OrderedDict来让dict变得有序:

d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
example2

OrderedDict有两个常用的函数可以对item进行操作:

popitem(last = True):删除最后一个插入的键值对;对应的False删除第一个键值对

move_to_end(key, last = True):将排序好的任意key-value插入到字典的结尾;对应的False则是插入到开头

d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
d.popitem()
d
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2)])
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
d.move_to_end('banana')
d
OrderedDict([('apple', 4), ('orange', 2), ('pear', 1), ('banana', 3)])

deque

deque是为了高效实现插入与删除操作的双向列表,相比于list,deque新增了appendleft和popleft两种方法,允许我们直接从开头插入和删除元素

from collections import deque
list1 = deque(['a', 'b', 'c', 'd'])
list1.popleft()
'a'
list1 = deque(['a', 'b', 'c', 'd'])
list1.appendleft('y')
list1
deque(['y', 'a', 'b', 'c', 'd'])

Counter

Counter也是dict的一个子类,可以看做一个计数器,用来统计相关元素出现的个数。

from collections import Counter
cnt = Counter()
for ch in 'hello':
    cnt[ch] += 1
cnt
Counter({'e': 1, 'h': 1, 'l': 2, 'o': 1})
# 使用 most_common(n) 返回一个list,包含Counter对象中出现最多的前n个元素
c = Counter('abracadabra')
c
Counter({'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r': 2})
c.most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要参考廖雪峰Python教程以及ZiWenXie前面提到字典是无序的,但有时我们需要有序的字典,这时就要用到...
    井底蛙蛙呱呱呱阅读 3,616评论 0 0
  • 最近在慕课网学习廖雪峰老师的Python进阶课程,做笔记总结一下重点。 基本变量及其类型 变量 在Python中,...
    victorsungo阅读 5,779评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,833评论 19 139
  • 本篇介绍利用Github和Hexo搭建技术博客的详细过程,以及各种优化配置. 花了一天时间,摸索利用Github+...
    hhstore阅读 5,960评论 2 5
  • 这一步 不管千难万险 终迈出 那温柔的目光 伴我一程又一程 出发为你 归来亦为你 这世界与我何干 这众生与我何干 ...
    沈安乐阅读 1,481评论 0 1

友情链接更多精彩内容