Python常用数据结构之collections模块建议收藏

collectionscollections是日常工作中的重点、高频模块,常用类型有:计数器(Counter)双向队列(deque)默认字典(defaultdict)有序字典(Ordered

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

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’)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120203.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android画廊效果的轮播图,ViewPage实现无限轮播画廊效果

    android画廊效果的轮播图,ViewPage实现无限轮播画廊效果1.效果图2.布局文件主要使用的android:clipChildren的意思:是否限制子View在其范围内。再父布局和viewpager中设置该属性,要显示三个界面,还要设置marginleft和marginRightandroid:layout_width=”match_parent”android:layout_height=”match_parent”android:clip…

    2022年4月28日
    53
  • PetaLinux学习笔记 2

    PetaLinux学习笔记 2现在遇到这样一个问题,没有USB,甚至于USB都没有电压输出,检查电路,USB供电是由一个TPS2051BDBV来控制的,这个芯片又是USB3320C来控制的,说明这个芯片没有工作。官方的例子是可以正常工作的。我仔细查看教程,找到了被我忽略掉的一个内核文件:linux-xlnx-xilinx-v2017.4.tar.gz。这个文件既然由官方提供,那一定是有改动在里面的。黑金在打包这个目录的时候,…

    2022年9月12日
    0
  • linux宝塔卸载,宝塔面板卸载与安装[通俗易懂]

    linux宝塔卸载,宝塔面板卸载与安装[通俗易懂]一键卸载宝塔Linux面板及运行环境命令1-使用xshell链接服务进入服务器命令:wgethttp://download.bt.cn/install/bt-uninstall.sh2-执行脚本命令:shbt-uninstall.sh3-根据提示4-完成更多功能及文档2,安装宝塔面板执行以下代码进行安装宝塔6.9免费版。宝塔6.9版本已经很稳定了,推荐大家直接安装6.9版本(注意:…

    2022年9月6日
    3
  • 遗传算法工具箱约束怎么输入_遗传算法中怎么添加约束条件

    遗传算法工具箱约束怎么输入_遗传算法中怎么添加约束条件前言网上有很多博客讲解遗传算法,但是大都只是“点到即止”,虽然给了一些代码实现,但也是“浅尝辄止”,没能很好地帮助大家进行扩展应用,抑或是进行深入的研究。这是我的开篇之作~之前没有写博客的习惯,一般是将笔记存本地,但久而久之发现回看不便,而且无法与大家交流和学习。现特此写下开篇之作,若有疏漏之处,敬请指正,谢谢!本文对遗传算法的原理进行梳理,相关代码是基于国内高校学生联合团队开源…

    2022年9月12日
    0
  • qrcodejs2–Vue生成二维码组件封装

    qrcodejs2–Vue生成二维码组件封装1.安装qrcodejs2:npminstallqrcodejs2–saveyarnaddqrcodejs22.初步封装组件:/***@file生成二维码的组件*@authorWalker*@date2020-03-16*/<template><divclass=”emqrcode”><but…

    2025年6月1日
    0
  • 建立友好城市有什么用_缔结友好城市

    建立友好城市有什么用_缔结友好城市原题连接Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。输入格式第1行,一个整数N,表示城市数。第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和

    2022年8月8日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号