• Python collections模块总结


    Counter

    这是一个继承dict的子类,专门用来做计数器,dict中的方法这里同样适用

    from collections import Counter其中数学运算如果其中一方的不存在,则会默认创建对应键,值为0的键值对

    counter = Counter("accab")  # Counter({'a': 2, 'c': 2, 'b': 1})
    counter2 = Counter([1,2,3,4])  # Counter({1: 1, 2: 1, 3: 1, 4: 1})
    counter5 = Counter([('a',3),('b', 2)])  # Counter({('a', 3): 1, ('b', 2): 1})
    # 字典
    counter3 = Counter({'a': 1, 'b': 2, 'a': 3})  # Counter({'a': 3, 'b': 2})
    counter4 = Counter(a=1, b=2, c=1)  # Counter({'b': 2, 'a': 1, 'c': 1})
    # elements
    # 键值以无序的方式返回,并且只返回值大于等于1的键值对
    elememts = counter.elements()
    print([x for x in elememts])  # ['a', 'a', 'c', 'c', 'b']
    # 为空是因为elements是generator
    print(sorted(elememts))  # []
    # most_common
    # 键值以无序的方式返回
    print(counter.most_common(1))  # [('a', 2)]
    print(counter.most_common())  # [('a', 2), ('c', 2), ('b', 1)]
    # update
    # 单纯是增加的功能,而不是像dict.update()中的替换一样
    counter.update("abb")
    print(counter)  # Counter({'a': 3, 'b': 3, 'c': 2})
    # subtract
    counter.subtract(Counter("accc"))
    print(counter)  # Counter({'b': 3, 'a': 2, 'c': -1})
    print([x for x in counter.elements()])  # ['a', 'a', 'b', 'b', 'b']
    # get
    # 键不存在则返回0,但是不会加入到counter键值对中
    print(counter['d'])
    print(counter)  # Counter({'b': 3, 'a': 2, 'c': -1})
    del counter['d']
    # 还可以使用数学运算
    c = Counter(a=3, b=1)
    d = Counter(a=1, b=2)
    # add two counters together:  c[x] + d[x]
    print(c + d)  # Counter({'a': 4, 'b': 3})
    # subtract (keeping only positive counts)
    print(c - d)  # Counter({'a': 2})
    # # intersection:  min(c[x], d[x])
    print(c & d) # Counter({'a': 1, 'b': 1})
    # union:  max(c[x], d[x])
    print(c | d)  # Counter({'a': 3, 'b': 2})
    # 一元加法和减法
    c = Counter(a=3, b=-1)
    # 只取正数
    print(+c)  # Counter({'a': 3})
    print(-c)  # Counter({'b': 1})

    deque

    由于deque同样能够提供列表相关的函数,所以其和列表相同的函数则不再赘述,这里比较独特的是和left相关的函数以及rotate函数。

    from collections import deque
    # 从尾部进入,从头部弹出,保证长度为5
    dq1 = deque('abcdefg', maxlen=5)
    print(dq1)  # ['c', 'd', 'e', 'f', 'g']
    print(dq1.maxlen)  # 5
    # 从左端入列
    dq1.appendleft('q')
    print(dq1)  # ['q', 'c', 'd', 'e', 'f']
    # 从左端入列
    dq1.extendleft('abc')
    print(dq1)  # ['c', 'b', 'a', 'q', 'c']
    # 从左端出列并且返回
    dq1.popleft()  # c
    print(dq1)  # ['b', 'a', 'q', 'c']
    # 将队头n个元素进行右旋
    dq1.rotate(2)
    print(dq1)  # ['q', 'c', 'b', 'a']
    # 将队尾两个元素进行左旋
    dq1.rotate(-2)
    print(dq1)  # ['b', 'a', 'q', 'c']
    def tail(filename, n=10):
        'Return the last n lines of a file'
        with open(filename) as f:
            return deque(f, n)
    def delete_nth(d, n):
        """
        实现队列切片和删除,pop之后再放会原处
        :param d: deque
        :param n: int
        :return:
        """
        d.roatte(-n)
        d.popleft()
        d.rotate(n)

    OrderedDict

    OrderedDict提供了一个有序字典,可以使用在遍历的时候根据相应的顺序进行输出,因为在dict中它的item是以任意顺序进行输出的。

    注意初始化的时候和在插入的话都根据插入顺序进行排序,而不是根据key进行排序。

    from collections import OrderedDict
    items = {'c': 3, 'b': 2, 'a': 1}
    regular_dict = dict(items)
    ordered_dict = OrderedDict(items)
    print(regular_dict)  # {'c': 3, 'b': 2, 'a': 1}
    print(ordered_dict)  # [('c', 3), ('b', 2), ('a', 1)]
    # 按照插入顺序进行排序而不是
    ordered_dict['f'] = 4
    ordered_dict['e'] = 5
    print(ordered_dict)  # [('c', 3), ('b', 2), ('a', 1), ('f', 4), ('e', 5)]
    # 把最近加入的删除
    print(ordered_dict.popitem(last=True))  # ('e', 5)
    # 按照加入的顺序删除
    print(ordered_dict.popitem(last=False))  # ('c', 3)
    print(ordered_dict)  # [('b', 2), ('a', 1), ('f', 4)]
    # 移动到末尾
    ordered_dict.move_to_end('b', last=True)
    print(ordered_dict)  # [('a', 1), ('f', 4), ('b', 2)]
    # 移动到开头
    ordered_dict.move_to_end('b', last=False)
    print(ordered_dict)  # [('b', 2), ('a', 1), ('f', 4)]
    ordered_dict['a'] = 3
    # 说明更改值并不会影响加入顺序
    print(ordered_dict.popitem(last=True))  # ('f', 4)

    提供了字典的功能,又保证了顺序。

     

    namedtuple

    如果我们想要在tuple中使用名字的参数,而不是位置,namedtuple提供这么一个创建名称tuple的机会。

    from collections import namedtuple
    Point = namedtuple('Point', ['x', 'y'])
    p = Point(10, y=20)
    print(p)  # Point(x=10, y=20)
    print(p.x + p.y)  # 30
  • 相关阅读:
    ONVIFclient搜索设备获取rtsp解决开发笔记(精华文章)
    openldap---ldapsearch使用
    简单工厂模式
    编译和运行时,库在何处
    Linux 双网卡绑定技术
    统计某个字符个数,小数运算,小数加减乘除
    2cifang.com_2次方学习
    c/c++ extern “C”
    环境变量0831
    股票技巧
  • 原文地址:https://www.cnblogs.com/z18271397173/p/9592121.html
Copyright © 2020-2023  润新知