zoukankan      html  css  js  c++  java
  • Python学习日记(十五) collections模块

    在内置函数(dict、list、set、tuple)的基础上,collections模块还提供了几个其他的数据类型:Counter、deque、defaultdict、namedtuple和OrdereDict等

    1.namedtuple

    作用:用于生成一个可以使用名字访问元素内容的tuple

    如果要表示一个点,我们可以这样表示,但是在使用时我们很难看出这个tuple是用来表示一个坐标

    p = (1,2)

    因此我们调用namedtuple来解决这个问题

    表示二维中的一个点:

    import collections
    Point = collections.namedtuple('Point',['x','y'])
    print(Point)        #<class '__main__.Point'>
    p = Point(1,2)
    print(p.x)          #1
    print(p.y)          #2
    print(p)            #Point(x=1, y=2)

    表示三维中的一个点:

    import collections
    Point = collections.namedtuple('Point',['x','y','z'])
    print(Point)        #<class '__main__.Point'>
    p = Point(1,2,3)
    print(p.x)          #1
    print(p.y)          #2
    print(p.z)          #3
    print(p)            #Point(x=1, y=2, z=3)

    表示一个圆的属性:

    import collections
    Circle = collections.namedtuple('Circle',['r','d','s','l'])

    表示一张扑克牌:

    import collections
    Card = collections.namedtuple('card',['c_class','c_num'])
    c = Card('方块','4')
    print(c.c_class)            #方块
    print(c.c_num)              #4        
    print(c)                    #card(c_class='方块', c_num='4')

    2.deque()

    这里先说一个队列quque()

    队列的特性:先进先出(FIFO)

    import queue
    i = 1
    q = queue.Queue()
    q.put(5)
    q.put(6)
    q.put(-5)
    print(q)          #<queue.Queue object at 0x0000000002082EB8>
    print(q.qsize())  #3    整个队列长度为3
    print(q.get())    #5
    print(q.get())    #6
    print(q.get())    #-5
    print(q.get())    #阻塞 因为整个队列只有3个元素,当3个元素全部取出后就再也取不出新的元素,程序就会一直等待用户给它一个值

    deque()双端队列,两边的头都可以取和存

    from collections import deque
    dq = deque([5,6])
    dq.append('a')              #从后面放数据
    dq.appendleft('b')          #从前面放数据
    dq.insert(1,'c')            #在1这个索引下加入'c',原位置下的元素往后移一位
    print(dq)                   #deque(['b', 'c', 5, 6, 'a'])
    print(dq.pop())             #a      向后弹出一个元素'a'
    print(dq.popleft())         #b      向前弹出一个元素'b'

    运用队列的好处在于能够高效插入和删除操作的双向列表,适合用于队列和栈

    而我们使用list,虽然访问元素速度很快但是我们要插入或删除一个元素就会慢很多,数据量大的时候后,插入和删除效率也会很低

    3.OrderedDict()

    当我们在操作字典时,我们无法确定自己的key的顺序,如果我们要保持这一顺序我们就可以使用有序字典OrderedDict()这一个方法

    from collections import OrderedDict
    od = OrderedDict([('k1',1),('k2',2),('k3',3)])
    print(od)       #OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
    print(od['k1']) #1
    for k in od:
        print(k)    #k1
                    #k2
                    #k3

    ps:存储一个列表或字典时,字典往往会比列表更占内存

    4.defaultdict()

    给字典通过一个没有参数的匿名函数设置一个默认值

    from collections import defaultdict
    d = defaultdict(lambda : 5)
    print(d['k'])   #5
    print(d['v'])   #5
    print(d['b'])   #5
    print(d)        #defaultdict(<function <lambda> at 0x0000000002158730>, {'k': 5, 'v': 5, 'b': 5})

    5.Counter()

    功能主要是跟踪值出现的次数,它是一个无序的容器,以键值对的形式储存,其中元素为key,其计数作为value,计数值可以是任意的int(包括负数和0),Counter类和其他语言的bags或multisets很相似

    from collections import Counter
    ret = Counter('avbb223')
    print(ret)      #Counter({'b': 2, '2': 2, 'a': 1, 'v': 1, '3': 1})
  • 相关阅读:
    UVA-679車的摆放(DFS)
    全排列问题(递归调用)
    STL栈的应用—UVA673
    nefu 84 五指山(扩展欧几里德)
    POJ 1061 青蛙的约会(扩展欧几里德)
    nefu 116 两仪剑法
    nefu 115 斐波那契的整除
    HDU 2099 整除的尾数
    Codeforces Round #339 (Div. 2) B. Gena's Code
    Codeforces Round #339 (Div. 2) A. Link/Cut Tree
  • 原文地址:https://www.cnblogs.com/Fantac/p/11421703.html
Copyright © 2011-2022 走看看