zoukankan      html  css  js  c++  java
  • python常用模块——collections

    1.collections在python的基本的数据类型之外给我们提供了额外的五种数据类型,以便我们更加方便的解决一些问题,它们分别是namedtuple、deque、counter、OrderDict、defaulrdict。

    2.namedtuple:命名元祖,是一个工厂函数。

    主要用来产生可以使用名称来访问元素的数据对象。

    通常用来增强代码的可读性,在访问一些tuple类型的数据时尤其好用。

    >>> P = namedtuple('Point',['x','y','z'])
    >>> p = P(1,2,3)
    >>> p.x
    1
    >>> p.y
    2
    >>> p.z
    3
    
    #通过属性来访问数据,有时候会达到意向不到的效果。
    >>> one_people = namedtuple('info',('name','sex','age','job'))
    >>> kebi =one_people('kebi','',25,'staff')
    >>> kebi.sex
    ''
    >>> kebi.age
    25
    >>> kebi.job
    'staff'

    3.deque:双端队列

    支持从两端高效的插入数据、支持随机访问的容器。

    双端队列支持的操作:

    append() 在尾部添加一个元素
    appendleft() 在头部添加一个元素
    pop() 从尾部删除一个元素,并返回删除的值
    popleft() 从头部删除一个元素,并返回删除的值
    extend() 从尾部扩展,被扩展的对象是可迭代对象
    extendleft() 从头部扩展,被扩展的对象是可迭代对象
    remove() 删除一个值
    clear() 清空队列
    rotate() 偏移,+向右偏,—向左偏
    count() 统计某个值出现的次数
    reverse() 反转

    由上面的方法我们就可以看出,双端队列与列表非常类似,但是比列表的功能更加强大。

    >>> q = deque(range(5))  #创建了一个双端队列
    >>> q
    deque([0, 1, 2, 3, 4])
    >>> q.append(5)      #从尾部添加
    >>> q
    deque([0, 1, 2, 3, 4, 5])
    >>> q.appendleft(6)   #从头部添加
    >>> q
    deque([6, 0, 1, 2, 3, 4, 5])
    >>> q.pop()   #删除最后面哪一个,并返回删除的那个元素
    5
    >>> q.popleft()  #删除最前面那个,返回删除的那个元素
    6
    >>> q
    deque([0, 1, 2, 3, 4])
    >>> q.rotate(1)    #向右偏移
    >>> q
    deque([4, 0, 1, 2, 3])
    >>> q.rotate(-2)  #向左偏移
    >>> q
    deque([1, 2, 3, 4, 0])
    
    >>> q.extend((-1,-2))   #扩展一个元祖
    >>> q
    deque([1, 2, 3, 4, 0, -1, -2])
    >>> q.extend(('wo'))   #扩展一个字符串
    >>> a
    '1-2*-12023'
    >>> q
    deque([1, 2, 3, 4, 0, -1, -2, 'w', 'o'])
    >>> q.extendleft(range(10,13))
    >>> q
    deque([12, 11, 10, 1, 2, 3, 4, 0, -1, -2, 'w', 'o'])

    4.OrdereDict:排序的字典,是字典的子类

    在前期的数据类型中,学习过dict,其中的键是无序的,OrderedDict是对dict的补充。

    为了说明OrderedDict和dict的区别,只用证明OrderedDict是由顺序的就行。

    在python2中字典是无序的可以直接测试出,在python3中貌似有部分联系。

    #在2中
    >>> d = {'c':3,'a':1,'b':2}
    >>> for i in d:
    ...     print i,d[i]
    ...
    a 1     #没有顺序一目了然
    c 3
    b 2
    
    在3中
    >>> d = {'c':3,'a':1,'b':2}
    >>> for i in d:
    ...     print(i,d[i])
    ...
    c 3
    a 1
    b 2   #貌似有点联系

    下面的方法无论在2中还是在3中都可以检测出,dict是无序的,而OrderedDict是有顺序的。

    #以不同的顺序把数据写到一张表里面。
    >>> d = {'a':1,'b':2,'c':3}
    >>> d2 = {'c':3,'a':1,'b':2}
    >>> bool(d ==d2)
    True
    #不管顺序如何,表是一样
    
    >>> D = OrderedDict()
    >>> D2 = OrderedDict()
    >>> D['a'] = 1
    >>> D['b'] = 2
    >>> D['c'] = 3
    >>> D2['c'] = 3
    >>> D2['a'] = 1
    >>> D2['b'] = 2
    >>> bool(D==D2)
    False
    #两张表不同,证明其对顺序有要求

     5.defaultdict:

    defaultdict使用工厂函数创建字典,使用的时候可以不用考虑缺失的key。

    python原生的dict结构,如果使用d[key]的方式访问,需要先判断key是否存在,如果不存在就会返回一个KeyError异常。

    defaultdict就是为了解决这个痛点而生,只要传入一个默认的工厂方法,访问不存在的键值时,就会返回初始设置的默认值。

    >>> d
    {'a': 1, 'b': 2, 'c': 3}
    >>> d['e']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'e'   #不存在就会报错
    
    >>> d3 = defaultdict(lambda:"N/A")
    >>> d3['a'] = 1
    >>> d3['b'] = 2
    >>> d3['c'] = 3
    >>> d3['e']    #访问不存在的键,会返回默认值。
    'N/A'
    
    >>> d4 = defaultdict(list)  #工厂函数作为默认值
    >>> d4['c'] = 3
    >>> d4['a'] = 1
    >>> d4['b']
    []

    6.Counter:计数

    Counter类的目的时用来跟踪值出现的次数。它是一个无序的容器类型,以字典键值对形式存储存。

    >>> b = Counter("aabbccdd")
    >>> b
    Counter({'a': 2, 'b': 2, 'c': 2, 'd': 2})   #跟踪计数,形成一个新的容器。
    >>> b['a']
    2
    >>> b['e']  #访问不存在的计数返回0
    0

    关于Counter的方法非常多

    update() 扩展,加上另一个对象
    subtract() 从中减去另一个对象
    elements() 返回一个迭代器,包含真实存在的元素
    most_common() 返回一个字典,元素由元素由单个字符和计数组成
    list() 转化成列表
    set() 转化成集合
    dict() 转化成字典
    sum() 求和
    clear() 清空
    #
    >>> b
    Counter({'a': 2, 'b': 2, 'c': 2, 'd': 2})
    >>> b.update('ddeeffwwww')
    >>> b
    Counter({'d': 4, 'w': 4, 'a': 2, 'b': 2, 'c': 2, 'e': 2, 'f': 2})
    

    # >>> b.subtract('ddeeffwwww') >>> b Counter({'a': 2, 'b': 2, 'c': 2, 'd': 2, 'e': 0, 'f': 0, 'w': 0})

    # >>> del b['e'] >>> b Counter({'a': 2, 'b': 2, 'c': 2, 'd': 2, 'f': 0, 'w': 0})

    # >>> b['a'] = 1 >>> b Counter({'b': 2, 'c': 2, 'd': 2, 'a': 1, 'f': 0, 'w': 0})

    #返回一个迭代器,返回真实存在的元素 >>> c = Counter(a=3,b=2,c=1,d=0) >>> c Counter({'a': 3, 'b': 2, 'c': 1, 'd': 0}) >>> list(c.elements()) ['a', 'a', 'a', 'b', 'b', 'c']

    #返回一个列表,元素和个数组成一个列表的元素 >>> g = Counter('aaddccc') >>> c.most_common() [('a', 3), ('b', 2), ('c', 1), ('d', 0)] >>> c.most_common(2) #可以指定显示的元素的个数 [('a', 3), ('b', 2)]

    Counter还支持一些算数操作符

    >>> opr1 =Counter(a=4,b=2)
    >>> opr2 =Counter(a=2,b=3)
    >>> opr1 + opr2
    Counter({'a': 6, 'b': 5})   #各元素相加的和
    >>> opr1 - opr2      #各元素相减的余,只取正值
    Counter({'a': 2})      #取双方都有的交集
    >>> opr1 & opr2
    Counter({'a': 2, 'b': 2})
    >>> opr1 | opr2       #取并集
    Counter({'a': 4, 'b': 3})
  • 相关阅读:
    IP分片与TCP分片的考虑
    snort-2.9.16在ubuntu16.04环境下的安装,配置与运行
    snort 程序流程图
    宿主机、容器、真实时间不一致问题
    ffi动态链接库的使用
    docker容器中nginx日志的分割
    dockerFile指令详解
    关于如何查看多网卡物理机中网卡序号与物理网卡的对应该关系
    Curl相关参数意义及使用方式
    docker 基础入门
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7834764.html
Copyright © 2011-2022 走看看