zoukankan      html  css  js  c++  java
  • python-collections模块

    简介

    本篇主要介绍collections模块中的以下几样:

    ①计数器counter()

    ②有序字典OrderedDict()

    ③默认字典defaultdict()

    ④双向队列deque()

    一、计数器counter()

    counter 是一种特殊的字典,主要方便用来计数,它继承于dict类,因此具有dict类中所有的功能,此外,还具备了自己特有的功能

    一小部分源码:

    import collections
    obj=collections.Counter('aabbddsafd')             #创建一个counter对象
    print(obj)
    
    -----结果-----
    Counter({'a': 3, 'd': 3, 'b': 2, 's': 1, 'f': 1})
    

    1.most_common()

    统计出现次数最多的几个元素

    import collections
    obj=collections.Counter('aabbddsafd')
    print(obj)
    print(obj.most_common(4))                         #拿到前四位
    
    -----结果------
    [('a', 3), ('d', 3), ('b', 2), ('s', 1)]
    

    2.更新update()

    import collections
    obj=collections.Counter('aaabb')
    print(obj)
    obj.update([11,22,'a'])
    print(obj)
    
    -----结果-----
    Counter({'a': 3, 'b': 2})
    Counter({'a': 4, 'b': 2, 11: 1, 22: 1})
    

    3.删除元素subtract()

    import collections
    obj=collections.Counter('aaabb')
    print(obj)
    obj.subtract(['a','11'])
    print(obj)
    
    -----结果-----
    Counter({'a': 3, 'b': 2})
    Counter({'a': 2, 'b': 2, '11': -1})
    

    注意:使用subtract()时,如果元素不够扣除,相应元素的个数会以负数的形式展示

    4.获取元素elements() 

    用counter()产生的对象,看上去像一个字典,其实并不是真实的字典,想要取其中的元素,得用elements()去获取

    import collections
    obj=collections.Counter('aabbddsafd')
    for k in obj.elements():
        print(k)
    
    -----结果-----
    a
    a
    a
    b
    b
    .
    .
    

    注意:如果想要取出其中key和values,得用dict类中的方法

    import collections
    obj=collections.Counter('aabbddsafd')
    for k,v in obj.items():
        print(k,v)
    
    -----结果-----
    a 3
    b 2
    d 3
    s 1
    f 1
    

    二、有序字典OrderedDict()

     创建一个有序字典:

    import collections
    dic=collections.OrderedDict()
    dic['k1']='v1'
    dic['k2']='v2'
    dic['k3']='v3'
    print(dic)
    
    -----结果-----
    OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
    

    1.移动到末尾move_to_end()

    import collections
    dic=collections.OrderedDict()
    dic['k1']='v1'
    dic['k2']='v2'
    dic['k3']='v3'
    dic.move_to_end('k1')
    print(dic)
    
    -----结果-----
    OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
    

    2.删除pop()与popitem()

    #pop()
    import collections
    dic=collections.OrderedDict()
    dic['k1']='v1'
    dic['k2']='v2'
    dic['k3']='v3'
    dic.pop('k1')
    print(dic)
    -----结果-----
    OrderedDict([('k2', 'v2'), ('k3', 'v3')])
    
    
    
    #popitem()     
    import collections
    dic=collections.OrderedDict()
    dic['k1']='v1'
    dic['k2']='v2'
    dic['k3']='v3'
    dic.popitem()             
    print(dic)
    -----结果-----
    OrderedDict([('k1', 'v1'), ('k2', 'v2')])
    

    对比结果可知,popitem()是去除最后一个元素,且其中不需要加入参数值,pop()是删除指定的元素,其中需要加入参数值,且删除的值可重新生成一个对象

    3. 设定默认值

    import collections
    dic=collections.OrderedDict()
    dic['k1']='v1'
    dic['k2']='v2'
    dic['k3']='v3'
    dic.setdefault('k4')        #当不指定值的时候,默认为None,效果等同于dic['k4']=None
    print(dic)
    
    -----结果-----
    OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', None)])
    

    三、默认字典defaultdict()

    作用:定义一个字典,让这个字典的值默认为某个类型

    创建一个默认字典:

    import collections
    dic = collections.defaultdict(list)     #对字典里值设置为list类型
    dic['k1'].append('test001')             #append是list类才有的方法,由于设了默认类型,才能用
    print (dic)
    
    -----结果-----
    defaultdict(<class 'list'>, {'k1': ['test001']})
    

    四、可命名元组nametuple()

    通常的元组,如果想要访问里面的元素,是只能通过索引去访问,如t[0]。而在可命名元组中,则可以针对每个元素定义一个名字,通过名字去访问相应的名字

    注意:在collections包中,可命名元组与其他不同的是:创建计数器、有序字典这些对象时,都是由相应的类产生的,但是,在该包中,没有"可命名元组"这个类,

             想要使用可命名元组,首先得创建一个类。通过nametuple()这个方法,去创建相应的类

    import  collections
    MytupleClass=collections.namedtuple('MytupleClass',['x','y','z'])    #创建类MytoupleClass
    obj=MytoupleClass(11,22,33)                                          #通过类创建了对象,其中x=11,y=22,z=33
    print(obj.x)
    print(obj.y)
    print(obj.z)
    
    -----结果-----
    11
    22
    33

    其中,MytupleClass是创建的类,obj为该类创建的对象,想看查看该类下面有哪些功能,可以使用如下方法:

    print(help(MytupleClass))

    部分截图如下:

    五、双向队列deque()

    队列是类似于栈一样的一种数据结构

    单向队列:先进先出,一端进,另一端出

    双向队列:在一端可以进和出,在另一端也可进和出

    1.添加元素

    import collections
    d=collections.deque()
    d.append('a')                  #从右边添加
    d.append('b')
    d.appendleft(1)                #从左边添加
    d.appendleft(2)
    print(d)  
    print(d.count('a'))            #用count()统计元素出现的个数
     
    -----结果-----
    deque([2, 1, 'a', 'b'])
    1
    

    2.扩展元素

    import collections
    d=collections.deque()
    d.extend(['aa','bb'])          #从右侧扩展
    d.extendleft([11,22])          #从左侧扩展
    print(d)
    
    -----结果-----
    deque([22, 11, 'aa', 'bb'])
    

      

    3.获取索引位置

    import collections
    d=collections.deque([1,2,3])
    print(d.index(1))
    
    -----结果-----
    0
    

    4.删除

    import collections
    d=collections.deque([1,2,3])
    d.pop()                #从右侧删除
    print(d)
    d.popleft()            #从左侧删除
    print(d) 
    
    -----结果-----
    deque([1, 2])
    deque([2])

    5.移动元素至首位

    import collections
    d=collections.deque([a,b,c])
    d.rotate(1)          # 把最后一个元素放到首位
    print(d)
    
    -----结果-----
    deque([c, a, b])
    

    其余一些方法不一一介绍....

    六、单向队列

    单向队列不属于collections包中,而在queue包中

    创建一个单向队列

    import  queue
    q=queue.deque()

    单向队列的方法在此文中不做介绍 

  • 相关阅读:
    2020年. NET Core面试题
    java Context namespace element 'component-scan' and its parser class ComponentScanBeanDefinitionParser are only available on JDK 1.5 and higher 解决方法
    vue 淡入淡出组件
    java http的get、post、post json参数的方法
    vue 父子组件通讯案例
    Vue 生产环境解决跨域问题
    npm run ERR! code ELIFECYCLE
    Android Studio 生成apk 出现 :error_prone_annotations.jar (com.google.errorprone:error) 错误
    记忆解析者芜青【总集】
    LwIP应用开发笔记之十:LwIP带操作系统基本移植
  • 原文地址:https://www.cnblogs.com/nizhihong/p/6641306.html
Copyright © 2011-2022 走看看