引言

python为我们提供了5种基本的数据结构:list, tuple, dict, set,字符串;

有时候我们需要维护一个有序的dict。所以这个时候我们就要用到Python标准库为我们提供的collections包了,它提供了多个有用的集合类,熟练掌握这些集合类,不仅可以让我们让写出的代码更加pythonic,也可以提高我们程序的运行效率。

defaultdict:

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

>>> from collections import defaultdict
>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]

例1:将default_factory设置为list

我们现在有上面这样一组list(列表),虽然我们有6组数据,但是仔细观察后发现其实我们只有两种color(颜色),但是每一个color对应多个值。现在我们想要将这个list转换成一个dict(字典),这个dict的key(键)对应一种color,dict的value(值)设置为一个list存放color对应的多个值。我们可以使用defaultdict(list)来解决这个问题。

# d可以看作一个dict(字典),dict的value是一个list(列表)
>>> d = defaultdict(list)
>>> for k,v in s:
...     d[k].append(v)
...
>>> d
defaultdict(<class 'list'>, {'blue': [2, 4, 4], 'red': [1, 3, 1]})

例2:将default_factory设置为set

上面这个例子中有一些不完美的地方,比如说{‘blue’: [2, 4, 4], ‘red’: [1, 3, 1]}这个defaultdict中blue颜色中包含两个4,red颜色中包含两个1,但是我们不希望含有重复的元素,这个时候可以考虑使用defaultdict(set)来解决这个问题。set(集合)相比list(列表)的不同之处在于set中不允许存在相同的元素。

>>> d = defaultdict(set)
>>> for k,v in s:
...     d[k].add(v)
...
>>> d
defaultdict(<class 'set'>, {'blue': {2, 4}, 'red': {1, 3}})

例3:将default_factory设置为int

通过使用defaultdict(int)的形式我们来统计一个字符串中每个字符出现的个数。

>>> s = 'hello world'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d
defaultdict(<class 'int'>, {'o': 2, 'h': 1, 'w': 1, 'l': 3, ' ': 1, 'd': 1, 'e': 1, 'r': 1})

OrderedDict:

我们知道默认的dict(字典)是无序的,但是在某些情形我们需要保持dict的有序性,这个时候可以使用OrderedDict,它是dict的一个subclass(子类),但是在dict的基础上保持了dict的有序型,下面我们来看一下使用方法。

>>> from collections import OrderedDict
# 无序的dict
>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}

例1:这是一个无序的dict(字典),现在我们可以使用OrderedDict来让这个dict变得有序。

# 将d按照key来排序
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
# 将d按照value来排序
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
# 将d按照key的长度来排序
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])

例2:使用popitem(last=True)方法可以让我们按照LIFO(先进后出)的顺序删除dict中的key-value,即删除最后一个插入的键值对,如果last=False就按照FIFO(先进先出)删除dict中key-value。

>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
# 将d按照key来排序
>>> d = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
>>> d
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
# 使用popitem()方法来移除最后一个key-value对
>>> d.popitem()
('pear', 1)
# 使用popitem(last=False)来移除第一个key-value对
>>> d.popitem(last=False)
('apple', 4)

例3:使用move_to_end(key, last=True)来改变有序的OrderedDict对象的key-value顺序,通过这个方法我们可以将排序好的OrderedDict对象中的任意一个key-value插入到字典的开头或者结尾。

>>> d = OrderedDict.fromkeys('abcde')
>>> d
OrderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)])
# 将key为b的key-value对移动到dict的最后
>>> d.move_to_end('b')
>>> d
OrderedDict([('a', None), ('c', None), ('d', None), ('e', None), ('b', None)])
>>> ''.join(d.keys())
'acdeb'
# 将key为b的key-value对移动到dict的最前面
>>> d.move_to_end('b', last=False)
>>> ''.join(d.keys())
'bacde'

Counter:

例1:Counter也是dict的一个subclass,它是一个无序容器,可以看做一个计数器,用来统计相关元素出现的个数。

>>> from collections import Counter
>>> cnt = Counter()
# 统计列表中元素出现的个数
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
...  cnt[word] += 1
...
>>> cnt
Counter({'blue': 3, 'red': 2, 'green': 1})
# 统计字符串中元素出现的个数
>>> cnt = Counter()
>>> for ch in 'hello':
...     cnt[ch] = cnt[ch] + 1
...
>>> cnt
Counter({'l': 2, 'o': 1, 'h': 1, 'e': 1})

例2:使用elements()方法按照元素的出现次数返回一个iterator(迭代器),元素以任意的顺序返回,如果元素的计数小于1,将忽略它。

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> c
Counter({'a': 4, 'b': 2, 'c': 0, 'd': -2})
>>> c.elements()
<itertools.chain object at 0x7fb0a069ccf8>
>>> next(c)
'a'
# 排序
>>> sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']

例3:使用most_common(n)返回一个list, list中包含Counter对象中出现最多前n个元素。

>>> c = Counter('abracadabra')
>>> c
Counter({'a': 5, 'b': 2, 'r': 2, 'd': 1, 'c': 1})
>>> c.most_common(3)
[('a', 5), ('b', 2), ('r', 2)]

namedtuple:

使用namedtuple(typename, field_names)命名tuple中的元素来使程序更具可读性。

>>> from collections import namedtuple
>>> Point = namedtuple('PointExtension', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.__class__.__name__
'PointExtension'
>>> p.x
1
>>> p.y
2

转载于:https://blog.51cto.com/liuzhengwei521/1919825

python标准库之collections相关推荐

  1. python链表库_[转]为什么python标准库没有实现链表

    实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用. 如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常 ...

  2. Python标准库collections中与字典有关的类

    Python标准库中提供了很多扩展功能,大幅度提高了开发效率.这里主要介绍OrderedDict类.defaultdict类和Counter类. (1)OrderedDict类 Python内置字典d ...

  3. Python标准库介绍

    1. 关于Python标准库 众所周知,Python是一个依赖强大的组件库完成对应功能的语言,为了便捷实现各项功能,前辈大牛们打造了多种多样的工具库公开提供给大众使用,而越来越多的库已经因为使用的广泛 ...

  4. [python教程入门学习]Python标准库映射类型与可散列数据类型的关系

    本文章向大家介绍Python标准库映射类型与可散列数据类型的关系,主要包括Python标准库映射类型与可散列数据类型的关系使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  5. 10个常用python标准库_【循序渐进学Python】11.常用标准库

    安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...

  6. python标准库(二)

    格式化输出 reprlib 库用来格式化 >>> import reprlib >>> reprlib.repr(set('aabbccddeeeff')) &qu ...

  7. 常用Python标准库对象速查表(1)

    封面图片:<Python程序设计基础(第2版)>,董付国,清华大学出版社 =============== 常用Python标准库对象速查表(1) 标准库 对象 简要说明 math sin( ...

  8. 5个python标准库及作用_零基础编程——Python标准库使用

    摘要 书接前文: 本文将讲解Python标准库内容,有操作系统接口os.文件路径通配符glob.命令行参数sys.正则表达式re.数学math.日期与时间.数据压缩.性能评估等,我们只需要知道有些什么 ...

  9. Python标准库:一些受欢迎的模块

    目录 1.模块sys 1).介绍 1.模块sys中一些重要的函数和变量 2.变量sys.argv 3.函数sys.exit 4.映射sys.modules 5.变量sys.path 6.变量sys.p ...

  10. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

最新文章

  1. Objective-C中的@property使用[五]
  2. mysql无法建立连接_【MySql】mysql无法建立连接或建立连接失败原因分析
  3. 【酷熊科技】工作积累 ----------- 在unity3d里怎样隐藏物体
  4. matlab求微分数值,用MATLAB语言求微积分方程的数值解.(xd^2y)/dx^2-5dy/dx+y=0y(0)=0y'(0)=0...
  5. 小程序商店刷榜_APP推广人必看|全球刷榜价格表单
  6. 精通 TensorFlow 1.x 中文版(初稿)
  7. 《深入浅出MySQL:数据库开发、优化与管理维护(第2版)》一一1.2 MySQL的安装...
  8. Script的加载方法小结
  9. iOS蓝牙开发总结-4
  10. 20191209每日一句
  11. yacc c语言语法分析器,GitHub - waxnkw/yacc: 简陋版语法分析器
  12. win10计算机用户账户和密码,win10改administrator账户密码的方法
  13. 用pdf转cad转换器进行操作的简单步骤
  14. python selenium+firefox对网页截长图
  15. 福永苹果服务器维修,苹果维修记录iphone app store更新打不开的解决方法
  16. ZigBee无线传感网络光照度监控系统设计
  17. 2路继电器控制直流电机正反转问题
  18. 希尔伯特的23个数学问题
  19. 如何使用计算机做海报,用word做的海报步骤_word怎么设计海报
  20. 如何用python画出一般函数图_python如何画函数图像

热门文章

  1. Ice_cream’s world III(prime)
  2. ImportError: No module named matplotlib.pyplot
  3. Icacls管理工具的使用
  4. 使用nginx反向代理获取百度MP3的真实网址
  5. 批量释放系统共享内存
  6. oracle数据库状态是started,ORACLE数据库状态与v$instance视图
  7. FreeSWITCH核心命令
  8. 3.1.2 Score Inflation 总分
  9. IntelliJ手动安装python与scala插件
  10. Hadoop Partitioner 实战详解