Python 数据结构常用模块: collectionsheapqoperatoritertools
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')
来源: https://www.cnblogs.com/xiaobingqianrui/p/8483118.html