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 = {"1":3, "3":2, "17":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":"123"}) print (dic) >>> defaultdict(<class 'dict'>, {'k1': {'asdsa': '123'}})
注:字典dic在定义的时候就定义好了值为字典类型,虽然现在字典中还没有键值 k1,但仍然可以执行字典的update方法. 这种操作方式在传统的字典类型中是无法实现的,必须赋值以后才能进行值得更新操作,否则会报错。
4. OrderedDict
有序字典也是字典的一个子类
传统方法进行字典排序
#定义传统字典 dic1 = dict() # 按顺序添加字典内容 dic1['a'] = '123' dic1['b'] = 'jjj' dic1['c'] = '394' dic1['d'] = '999' 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'] = '123' dic2['b'] = 'jjj' dic2['c'] = 'abc' dic2['d'] = '999' 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')