首页 > 编程语言 >Python模块之Collections

Python模块之Collections

时间:2023-06-27 20:32:59浏览次数:54  
标签:元素 name Python age Counter Collections 模块 print 字典


collections的常用类型有:

  • 计数器(Counter)
  • 双向队列(deque)
  • 默认字典(defaultdict)
  • 有序字典(OrderedDict)
  • 可命名元组(namedtuple)

使用以上类型时需要导入模块 from collections import *

1. Counter

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




1. s = 'abcbcaccbbad'  
2. l = ['a','b','c','c','a','b','b']  
3. d = {'2': 3, '3': 2, '17': 2}  
4. # Counter 获取各元素的个数,返回字典  
5. print(Counter(s))   # Counter({'c': 4, 'b': 4, 'a': 3})  
6. print(Counter(l))   # Counter({'b': 3, 'a': 2, 'c': 2})  
7. print(Counter(d))   # Counter({3: 3, 2: 2, 17: 1})


most_common




1. # most_common(int) 按照元素出现的次数进行从高到低的排序,返回前int个元素的字典  
2. m1 = Counter(s)  
3. print(m1)                 # Counter({'c': 4, 'b': 4, 'a': 3, 'd': 1})  
4. print(m1.most_common(3))  # [('c', 4), ('b', 4), ('a', 3)]

elements



1. # elements 返回经过计数器Counter后的元素,返回的是一个迭代器  
2. e1 = Counter(s)  
3. print(''.join(sorted(e1.elements())))  # aaabbbbcccc  
4. e2 = Counter(d)  
5. print(sorted(e2.elements()))  # ['17', '17', '2', '2', '2', '3', '3'] 字典返回value个key


update




1. # update 和set集合的update一样,对集合进行并集更新  
2. u1 = Counter(s)  
3. u1.update('123a')  
4. print(u1)  # Counter({'a': 4, 'c': 4, 'b': 4, '1': 1, '3': 1, '2': 1})


substract




1. # substract 和update类似,只是update是做加法,substract做减法,从另一个集合中减去本集合的元素,  
2. sub1 = 'which'  
3. sub2 = 'whatw'  
4. subset = Counter(sub1)  
5. print(subset)   # Counter({'h': 2, 'i': 1, 'c': 1, 'w': 1})  
6. subset.subtract(Counter(sub2))  
7. print(subset)   # Counter({'c': 1, 'i': 1, 'h': 1, 'a': -1, 't': -1, 'w': -1}) sub1中的h变为2,sub2中h为1,减完以后为1


iteritems



与字典dict的items类似,返回由Counter生成的字典的所有item,只是在Counter中此方法返回的是一个迭代器,而不是列表



iterkeys



与字典dict的keys方法类似,返回由Counter生成的字典的所有key,只是在Counter中此方法返回的是一个迭代器,而不是列表



itervalues



与字典dict的values方法类似,返回由Counter生成的字典的所有value,只是在Counter中此方法返回的是一个迭代器,而不是列表



2.deque


deque 包含在文件_collections.py中,属于高性能的数据结构(High performance data structures)之一.可以从两端添加和删除元素,常用的结构是它的简化版。

deque常用方法:

deque




1. str1 = 'abc123cd'  
2. dq = deque(str1)  
3. print(dq)        # deque(['a', 'b', 'c', '1', '2', '3', 'c', 'd'])

append


队列右边添加元素

appendleft


队列左边添加元素




1. dq = deque('abc123')  
2. dq.append('right')  
3. dq.appendleft('left')  
4. print(dq) # deque(['left', 'a', 'b', 'c', '1', '2', '3', 'right'])

clear


clear 清空队列中的所有元素



count


count(value)  返回队列中包含value的个数,结果类型为 integer


extend


extend 队列右边扩展,可以是列表、元组或字典,如果是字典则将字典的key加入到deque

extendleft


extendleft  同extend, 在左边扩展

1. dq = deque('abc123')  
2. dq.extend({1:10,2:20})  
3. dq.extendleft('L')  
4. print(dq) # deque(['L', 'a', 'b', 'c', '1', '2', '3', 1, 2])


pop



pop  移除并且返回队列右边的元素



popleft


popleft 移除并且返回队列左边的元素



remove


remove(value) 移除队列第一个出现的元素(从左往右开始的第一次出现的元素value)

reverse


reverse  队列的所有元素进行反转




rotate


rotate(n) 对队列的数进行移动,若n<0,则往左移动即将左边的第一个移动到最后,移动n次,n>0 往右移动





1. dq = deque([1,2,3,4,5])  
2. dq.rotate(-1) # 左移,1往左移动一位到5后面  
3. print(dq)




3.defaultdict


默认字典,是字典的一个子类,继承有字典的方法和属性,默认字典在进行定义初始化的时候可以指定字典值得默认类型:


1. dic = collections.defaultdict(dict)  
2. dic['k1'].update({'k2':'aaa'})  
3. print(dic)


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

我看看一下传统的字典类型




1. b = dict()  
2. b['k1'].append('2')  
3. # TypeError: 'type' object is not iterable


4.OrderedDict 


OrderDict 叫做有序字典,也是字典类型(dict)的一个子类,是对字典的一个补充。 前面我们说过,字典类型是一个无序的集合,如果要想将一个传统的字典类型进行排序一般会怎么做了,我们可能会将字典的键值取出来做排序后在根据键值来进行有序的输出,我们看下面的一个例子:





1. # 定义传统字典  
2. dic1 = dict()  
3. # 按顺序添加字典内容  
4. dic1['a'] = '123'  
5. dic1['b'] = 'jjj'  
6. dic1['c'] = '394'  
7. dic1['d'] = '999'  
8. print(dic1)    # 结果: {'a': '123', 'c': '394', 'b': 'jjj', 'd': '999'}  
9. # 排序  
10. dic1_key_list = []  
11. for k in dic1.keys():  
12.     dic1_key_list.append(k)  
13. dic1_key_list.sort()  
14. for key in dic1_key_list:  
15. print('dic1字典排序结果 %s:%s' %(key,dic1[key]))


以上为定义传统字典类型时的一个简单排序过程。 如果我们定义一个有序字典时,将不用再如此麻烦, 字典顺序将按照录入顺序进行排序且不会改变。


1. # 定义有序字典  
2. dic2 = OrderedDict()  
3. dic2['a'] = '123'  
4. dic2['b'] = 'jjj'  
5. dic2['c'] = 'abc'  
6. dic2['d'] = '999'  
7. for k, v in dic2.iteritems():  
8. print('有序字典:%s:%s' %(k,v))


5.nametuple

标准的tuple类型使用数字索引来访问元素,




1. bob = ('Bob', 30, 'male')  
2. print('Representation:', bob)  
3.   
4. jane = ('Jane', 29, 'female')  
5. print('\nField by index:', jane[0])  
6.   
7. print('\nFields by index:')  
8. for p in [bob, jane]:  
9. print('%s is a %d year old %s' % p)

这种对于标准的元组访问,我们需要知道元素对应下标索引值,但当元组的元素很多时,我们可能无法知道每个元素的具体索引值,这个时候就是可命名元组登场的时候了。

nametuple 的创建是由自己的类工厂nametuple()进行创建,而不是由标准的元组来进行实例化,通过nametuple()创建类的参数包括类名称和一个包含元素名称的字符串




1. from collections import namedtuple  
2.   
3. #创建一个nametuplede 类,类名称为Person,并赋给变量P  
4. P = namedtuple('Person', 'name,age,gender')  
5. print('Type of Person:', type(P))  # Type of Person: <class 'type'>  
6.   
7. #通过Person类实例化一个对象bob  
8. bob = P(name='Bob', age=30, gender='male')  
9. print('\nRepresentation:', bob)  # Representation: Person(name='Bob', age=30, gender='male')  
10.   
11. #通过Person类实例化一个对象jane  
12. jane = P(name='Jane', age=29, gender='female')  
13. print('\nField by name:', jane.name)  # Field by name: Jane  
14.   
15. print('\nFields by index:')  
16. for p in [bob, jane]:  
17. print('%s is a %d year old %s' % p)  
18. # Fields by index:  
19. # Bob is a 30 year old male  
20. # Jane is a 29 year old female


通过上面的实例可以看出,我们通过nametuple()创建了一个Person的类,并复制给P变量,Person的类成员包括name,age,gender,并且顺序已经定了,在实例化zhangsan这个对象的时候,对张三的属性进行了定义。这样我们在访问zhangsan这个元组的时候就可以通过张三的属性来复制(zhangsan.name、zhangsan.age等)。这样就算这个元组有1000个元素我们都能通过元素的名称来访问而不用考虑元素的下标索引值。

非法的参数值

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




1. # 参数字段的名称非法,包含系统名称class  
2. try:  
3. 'Person','age,name,class,gender')  
4. print(p._fields)  
5. except ValueError as err:  
6. print(err)  
7.   
8. # Type names and field names cannot be a keyword: 'class'  
9.   
10. # 类成员字段参数名称重复 age  
11. try:  
12. 'Person','age,gender,name,age')  
13. print(p1._fields)  
14. except ValueError as err:  
15. print(err)  
16. # Encountered duplicate field name: 'age'


但是也有时候我们是无法控制的,如果参数的名称来自外部,比如是通过读取数据库中的内容来传递的参数,此时我们无法手工的修改参数名称,那该如何是好呢! 别担心,只需要增加一个属性就OK了,它就是rename




1. # 参数字段的名称非法,包含系统名称class  
2. try:  
3. 'Person','age,name,class,gender',rename=True)  
4. print(p._fields)  
5. except ValueError as err:  
6. print(err)  
7.   
8. # ('age', 'name', '_2', 'gender')  
9.   
10. # 类成员字段参数名称重复 age  
11. try:  
12. 'Person','age,gender,name,age',rename=True)  
13. print(p1._fields)  
14. except ValueError as err:  
15. print(err)  
16. # ('age', 'gender', 'name', '_3')


从以上的实例我们看出,当有参数错误的时候,系统自动将错误的参数通过增加 "下划线+参数索引" 的方式自动将参数名称替换了。


参考文档:

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001411031239400f7181f65f33a4623bc42276a605debf6000

https://pymotw.com/2/collections/namedtuple.html


标签:元素,name,Python,age,Counter,Collections,模块,print,字典
From: https://blog.51cto.com/u_12667998/6565431

相关文章

  • Python全栈工程师(42:Web框架Django步骤)
    1.创建Django工程django-adminstartproject工程名2.创建appcd工程名pythonmanage.pystartappcmdb3.静态文件project.settings.pySTATICFILES_DIRS = (  'static'),      ) 4.模板路径TEMPLATE_DIRS = (  'templates'),      ) 5.settings中middlerwa......
  • 【雕爷学编程】Arduino动手做(131)---跑马灯矩阵键盘模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • Python | 魔法函数`__iter__`的用法
    下面是找到的一个比较好的科学解释:Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__()方法或__getitem__()方法访问。__iter__方法的作用是让对象可以用for…inobj循环遍历,__getitem__()方法是......
  • Python | 魔法函数`__contains__`的用法
    在python的字符串、列表、元组、结合等对象的时候,经常使用in的方法,一个类的对象能够使用in,就是因为这个类实现了__contains__魔法函数如下面的代码,演示了类的对象使用in的情形classStudent():def__init__(self,name):self.name=namedef__contains__(self......
  • Python | 魔法函数`__str__`的用法
    __str__是Python内置函数,用于将对象转换为字符串表示形式。在Python中,每个类都可以重写__str__方法,以便自定义对象的字符串表示形式。当使用print函数将对象输出到控制台时,Python会自动调用对象的__str__方法,将其转换为字符串并输出到控制台。因此,对于一个自定义的类......
  • Python | 魔法函数`__len__`的用法
    在python的字符串、列表等元素的时候经常使用len()方法计算长度,之所以能够使用len()方法,就是因为它的类实现了__len__魔法函数如:classStudent():def__init__(self,name):self.name=namedef__len__(self):returnlen(self.name)s=Student("Jack......
  • Python 选择排序
    思路:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾重复第二步,直到所有元素均排序完毕 Code:1defselectSort(arr):2foriinrange(0,len(arr)):#i表示多少......
  • 10 家世界顶级的公司都在用 Python 做什么?
    https://towardsdatascience.com/10-world-class-companies-using-python-26cde24919a8用Python写代码的乐趣在于它可以使用简短、简洁、可读性高的类,用少量清晰的代码表达了大量的操作,避免了很多琐碎的代码。-GuidovanRossum在当下,很多公司都在使用数字工具管理他们的各个方......
  • 10 个最值得 Python 新人练手的有趣项目
    作者| ClaireD.Costa编译|Wendy有很多Python新手留言问:“Python入门很久了,但项目经验很少,有没有什么项目,可以让自己实践一下呢?”这是个很普遍的问题,首先你要想好做什么类别的项目,总体来说,项目分为三类:Web构建一个Web应用发布在网络上让用户访问使用。需要实现Web应用......
  • etcd网络模块解析
    1.RaftHttp模块介绍在etcd里raft模块和网络模块是分开的,raft模块主要负责实现共识算法,保证集群节点的一致性,消息的发送和接收则交给raftHttp网络模块来处理,由上层应用模块来进行协调交互和消息传递。 1.1.整体结构图  (1)当raft模块发生了状态变化时,会把变化的消息封装......