Python数据结构常用模块:collections、heapq、operator、itertools

collections

  collections是日常工作中的重点、高频模块,常用类型有:

  计数器(Counter)

  双向队列(deque)

  默认字典(defaultdict)

  有序字典(OrderedDict)

  可命名元组(namedtuple) 

1. Counter

  Counter作为字典dicit()的一个子类用来进行hashtable计数,将元素进行数量统计,计数后返回一个字典,键值为元素,值为元素个数

  常用方法:

most_common(int) 按照元素出现的次数进行从高到低的排序,返回前int个元素的字典
elements 返回经过计算器Counter后的元素,返回的是一个迭代器
update 和set集合的update一样,对集合进行并集更新
substract 和update类似,只是update是做加法,substract做减法,从另一个集合中减去本集合的元素
iteritems 返回由Counter生成的字典的所有item
iterkeys 返回由Counter生成的字典的所有key
itervalues 返回由Counter生成的字典的所有value

  示例:

#coding=utf-8

from collections import Counter

str = "abcbcaccbbad"
li = ["a","b","c","a","b","b"]
d = {"":3, "":2, "":2} #Counter获取各元素的个数,返回字典
print ("Counter(s):", Counter(str))
print ("Counter(li):", Counter(li))
print ("Counter(d):", Counter(d)) #most_common(int)按照元素出现的次数进行从高到低的排序,返回前int个元素的字典
d1 = Counter(str)
print ("d1.most_common(2):",d1.most_common(2)) #elements返回经过计算器Counter后的元素,返回的是一个迭代器
print ("sorted(d1.elements()):", sorted(d1.elements()))
print ('''("".join(d1.elements())):''',"".join(d1.elements()))
#若是字典的话返回value个key
d2 = Counter(d)
print("若是字典的话返回value个key:", sorted(d2.elements())) #update和set集合的update一样,对集合进行并集更新
print ("d1.update("sas1"):",d1.update("sas1"))

>>>> Counter(s): Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
>>>> Counter(li): Counter({'b': 3, 'a': 2, 'c': 1})
>>>> Counter(d): Counter({'1': 3, '3': 2, '17': 2})
>>>> d1.most_common(2): [('b', 4), ('c', 4)]
>>>> sorted(d1.elements()): ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd']
>>>> ("".join(d1.elements())): aaabbbbccccd
>>>> ['1', '1', '1', '17', '17', '3', '3']

2. deque

  deque属于高性能的数据结构之一,常用方法如下:

append 队列右边添加元素
appendleft 队列左边添加元素
clear 清空队列中的所有元素
count 返回队列中包含value的个数
extend 队列右边扩展,可以是列表、元组或字典,如果是字典则将字典的key加入到deque
extendleft 同extend,在左边扩展
pop 移除并返回队列右边的元素
popleft 移除并返回队列左边的元素
remove(value) 移除队列第一个出现的元素
reverse 队列的所有元素进行反转
rotate(n) 对队列数进行移动

3. defaultdict

  默认字典,字典的一个子类,继承所有字典的方法,默认字典在进行定义初始化的时候得指定字典值有默认类型

dic = defaultdict(dict)

  dic["k1"].update({"asdsa":""}) 

  print (dic)

>>> defaultdict(<class 'dict'>, {'k1': {'asdsa': ''}})

  注:字典dic在定义的时候就定义好了值为字典类型,虽然现在字典中还没有键值 k1,但仍然可以执行字典的update方法. 这种操作方式在传统的字典类型中是无法实现的,必须赋值以后才能进行值得更新操作,否则会报错。

4. OrderedDict

  有序字典也是字典的一个子类

  传统方法进行字典排序

#定义传统字典
dic1 = dict()
# 按顺序添加字典内容
dic1['a'] = ''
dic1['b'] = 'jjj'
dic1['c'] = ''
dic1['d'] = ''
print(dic1) # 结果: {'a': '123', 'c': '394', 'b': 'jjj', 'd': '999'}
# 排序
dic1_key_list = []
for k in dic1.keys():
dic1_key_list.append(k)
dic1_key_list.sort()
for key in dic1_key_list:
print('dic1字典排序结果 %s:%s' %(key,dic1[key]))

  使用OrderedDict对字典进行排序

#定义有序字典
dic2 = OrderedDict()
dic2['a'] = ''
dic2['b'] = 'jjj'
dic2['c'] = 'abc'
dic2['d'] = ''
for k, v in dic2.iteritems():
print('有序字典:%s:%s' %(k,v))

5. namedtuple

  namedtuple由自己的类工厂namedtuple()进行创建,而不是由表中的元组进行初始化,通过namedtuple创建类的参数包括类名称和一个包含元素名称的字符串

  常用方法示例:

#coding=utf-8

from collections import namedtuple

p = namedtuple("person", "name,age,sex")
print (type(p)) zhanglin = p("zhanglin",30,"male")
print(zhanglin)
print(zhanglin.name,zhanglin.age)

 >>> <class 'type'>
 >>> person(name='zhanglin', age=30, sex='male')
 >>> zhanglin 30

  rename参数使用

  使用namedtuple()来创建类的时候,传递的成员属性参数名称不能非法(不能重复,不能为系统标识符),否则会报错

try:
pp = namedtuple("person","name,age,class,sex")
print(pp._fields)
lili = pp("lili",20,"aa","male")
except Exception as e:
print("error",e)

 >>> error Type names and field names cannot be a keyword: 'class'

  输入错误非我们可以控制,namedtuple提供rename=True参数会使系统自动的将错误的参数通过“下划线+参数索引”的方式将参数名称替换

try:
pp = namedtuple("person","name,age,class,sex",rename=True)
print(pp._fields)
lili = pp("lili",20,"aa","male")
except Exception as e:
print("error",e)

 >>> ('name', 'age', '_2', 'sex')

Python常用数据结构之collections模块的更多相关文章

  1. Python常用数据结构之heapq模块

    Python数据结构常用模块:collections.heapq.operator.itertools heapq 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小 ...

  2. Python常用内置模块之xml模块

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  3. Python 入门之 内置模块 -- collections模块

    Python 入门之 内置模块 -- collections模块 1.collections -- 基于Python自带的数据类型之上额外增加的几个数据类型 from collections ​ 在内 ...

  4. Python常用的内建模块

    PS:Python之所以自称“batteries included”,就是因为内置了许多非常有用的模块,无需额外安装和配置,即可直接使用.下面就来看看一些常用的内建模块. 参考原文 廖雪峰常用的内建模 ...

  5. python常用数据结构讲解

    一:序列     在数学上,序列是被排成一排的对象,而在python中,序列是最基本的数据结构.它的主要特征为拥有索引,每个索引的元素是可迭代对象.都可以进行索引,切片,加,乘,检查成员等操作.在py ...

  6. python基础学习笔记——collections模块

    在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和Ord ...

  7. python常用数据结构(1)

    python中有四种最常用的数据结构,分别是列表(list),字典(dict),集合(set)和元组(tuple) 下面简单描述下它们的区别和联系 1.初始化 不得不说,python数据结构的初始化比 ...

  8. Python常用数据结构(列表)

    Python中常用的数据结构有序列(如列表,元组,字符串),映射(如字典)以及集合(set),是主要的三类容器 内容 序列的基本概念 列表的概念和用法 元组的概念和用法 字典的概念和用法 各类型之间的 ...

  9. python常用数据结构(2)

    1.有名字的元组——namedtuple >>> from collections import namedtuple >>> Point = namedtuple ...

随机推荐

  1. List源码学习之LinkedList

    LinkedList 内部数据接口为一个链表,存储数据可为空可重复. 1.包含主要参数: //集合长度transient int size = 0; /** * 头结点 */ transient No ...

  2. Schema与数据类型优化

    良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询数据来设计schema,这往往需要权衡各种因素. MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要. 更小的通 ...

  3. Go语言是我见过最简洁的语言(除了lua)

    写在前面:题目就是个标题党,在这里先道歉,其次撸主学过很多语言(基本上是个语言都要上一下的那种人,但是不会太深入,只做了解,因为很多用不到),但主要使用C#语言(不过已经开始恶心C#的臃肿,不要打我) ...

  4. python3的一些改动常用到的

    更多的内容会接下来说明,只举几个例子. https://docs.python.org/2/library/2to3.html 1. map的输出,要在前面加list转化 2. map(lambda ...

  5. _0_web_基础

    创:18_3_2017修:20_3_2017 什么是前端? --在浏览器中展示内容以及处理请求 什么是浏览器? --一款能将网页内容展现给用户查看,并且让用户与网页交互的软件 什么是内核? --渲染引 ...

  6. test for python urllib

    #!/usr/bin/python import urllib2 import time import logging import threading succCount = 0 failCount ...

  7. msyql多软件连接

    菜鸟一枚 使用mysql删除数据库时,习惯性使用navicat,由于使用的是sqlyog备份的,就用sqlyog恢复数据库,结果总是报错. 用同事电脑没有问题,后来发现是用了不同的软件,导致数据库数据 ...

  8. PHP date()函数详解

    date (PHP 4, PHP 5) date - 格式化一个本地时间/日期 说明¶ string date ( string $format [, int $timestamp ] ) 返回将整数 ...

  9. Android webView包装WebAPP

    前言 Android webView 兼容体验真的差到了极点!! 前一阵子,老板要讲 WebAPP 放到 Android 和 iOS 里面,而我因为以前做过安卓,所以这方面就由我来打包, 原理是很简单 ...

  10. 再看Java基本类型

    Java中的基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte.short.int.long.float.double. 数值类型又可以分为整数类型byte.short ...