L-Jason

do sth you need, then do sth you want 。。。

python标准库之collections

<!doctype html>python标准库之collection

python标准库之collections

最近在工作零零散散的用到了一些collections的方法,突然有个想法来将它整理一下。


简介

collections是python中基础数据类型的容器模块,提供了更加便捷和快速的数据类型操作的方法,我们可以在合适的场景去运用他们。

 

常用方法

  • Counter()

    统计序列中元素的个数:

    作为输入, Counter 对象可以接受任意的由可哈希(hashable)元素构成的序列对象。 在底层实现上,一个 Counter 对象就是一个字典,将元素映射到它出现的次数上。

     
     
     
    xxxxxxxxxx
     
     
     
     
    from collections import Counter
    def test_counter():
        text = "kshfkhdghskdnvknsighdsihinisdhguidhicoidsjiohfiuerhrfjsiohgi"
        words = Counter(text)
        print(words.items())  # 序列中各元素出现的次数
        print(words.most_common(3))  # 序列中出现次数最多的三个
        print(words["k"])  # 查看序列中某个元素出现的次数
        
    if __name__ == '__main__':
        test_counter()
        
    """
    dict_items([('k', 4), ('s', 7), ('h', 10), ('f', 3), ('d', 6), ('g', 4), ('n', 3), ('v', 1), ('i', 11), ('u', 2), ('c', 1), ('o', 3), ('j', 2), ('e', 1), ('r', 2)])
    [('i', 11), ('h', 10), ('s', 7)]
    4
    """
     

     

  • defaultdict()

    看了很多对defaultdict的解释没有一个能完美通俗的解释清楚的,那我们就简单从字面上去理解他吧,我觉得这样反倒更清晰。

    定义一个默认格式的字典,他是dict的一个子类,那怎么定义一个默认格式的字典呢,请看下面的例子

     
     
     
    xxxxxxxxxx
     
     
     
     
    from collections import defaultdict
    def test_defaultdict():
        d = defaultdict(list)  # 创建一个value默认为list类型的字典
        d["a"].append(1)
        d["a"].append(2)
        d["a"].append(3)
        print(d)
        print(d["a"])
        print(d["b"])  # 即使没有key("b"),取值也不会报错,依然会有默认值[]
        s = defaultdict(set)  # 创建一个value默认为list类型的字典
        s["aa"].add(1)
        s["aa"].add(2)
        print(s["aa"],"__", s["bb"])
    if __name__ == '__main__':
        test_defaultdict()
        
    """
    defaultdict(<class 'list'>, {'a': [1, 2, 3]})
    [1, 2, 3]
    []
    {1, 2} __ set()
    """
     

     

     

  • OrderDict()

    OrderDict()字典排序,我们知道python的基本数据类型字典是无序的,但是我们想创建一个有序的字典怎么办呢?这个时候我们就可以用OrderDict()来创建,它会保留键值插入的顺序并以此顺序排列。

    OrderDict内部维护着一个根据键值插入顺序的双向链表,每当一个新的元素被插入进来的时候,它会被放到链表的尾部。对于一个已存在的键值赋值不会改变键值的顺序。

    需要注意的是OrderDict是一个普通字典大小的两倍,因为它内部维护着另外一个链表。使用时要注意这点。

     
     
     
    xxxxxxxxxx
     
     
     
     
    >>> od = OrderedDict()
    >>> od['z'] = 1
    >>> od['y'] = 2
    >>> od['x'] = 3
    >>> od.keys() # 按照插入的Key的顺序返回
    ['z', 'y', 'x']
     

     

  • namedtuple()

    namedtuple()是一个方法生成的对象是tuple的子类,用来定义一个有指定含义的元组,通常我们定义一个元组无法知道他内部元素的含义,但是使用了namedtuple()就可以很清晰的知道这个元祖的的元素是用来干什么的

     
     
     
    x
     
     
     
     
    from collections import deque, namedtuple
    def test_namedtuple():
        Person = namedtuple("Person", ["name", "age", "gender"])
        person = Person("lily", 20, "female")
        print(person.age)
        print(person.name)
        print(person.gender)
    if __name__ == '__main__':
        test_namedtuple()
        
    """
    20
    lily
    female
    """
     

     

  • deque()

    deque()可以创建一个队列容器,供我们消费,它与python的队列的区别在于deque()在增加元素的时候,超出设定元素个数大小时,会默认删除最早的那个;同时deque不像list是一个线性存储,deque是一个双向链表,数据量大的时候插入效率大大高于list

     
     
     
    x
     
     
     
     
    from collections import deque
    def test_deque():
        q1 = deque(maxlen=3)
        q1.append(1)
        q1.append(2)
        q1.append(3)
    q1。qppend(4)
        print(q1)
    if __name__ == '__main__':
        test_deque()
    # deque([2, 3, 4], maxlen=3)
     

    deque包含的方法:其中pop从队列的 尾部抛出数据,如果想从队列头部取数据则用popleft()

    image-20200623000756398

 

posted @ 2020-06-25 00:16  L-Jason  阅读(269)  评论(0编辑  收藏  举报