zoukankan      html  css  js  c++  java
  • python(三):collection模块

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

  • 相关阅读:
    数论-剩余类、完全剩余系、缩系、欧拉函数
    数论-同余式
    计算机科研项目中的重点项目、重大项目、重大研究计划项目,重点研发计划有什么区别和联系?
    VFS虚拟文件系统
    git中文名转义带来的麻烦;git配置之core.quotepath;git中文乱码
    nodejs 与 npm 配置
    mongodb 部署 安装 使用 记录
    GPG error: https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 656408E390CFB1F5
    slurm 网路监控软件使用
    Win10 64位,北航研究生教务系统文件打印办法(旧版GSMIS),只要三步就能解决;
  • 原文地址:https://www.cnblogs.com/zhangxianrong/p/14690402.html
Copyright © 2011-2022 走看看