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

    我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型:

    (1)namedtuple(): 生成可以使用名字来访问元素内容的tuple子类 
    (2)deque: 双端队列,可以快速的从另外一侧追加和推出对象 
    (3)Counter: 计数器,主要用来计数 
    (4)OrderedDict: 有序字典 
    (5)defaultdict: 带有默认值的字典 

    =>namedtuple(typename, field_names, verbose=False, rename=False)

    比如我们用户拥有一个这样的数据结构,每一个对象是拥有三个元素的tuple。
    使用namedtuple方法就可以方便的通过tuple来生成可读性更高也更好用的数据结构

     1 wdebsites = [
     2     ('Sohu', 'http://www.google.com/', '张朝阳'),
     3     ('Sina', 'http://www.sina.com.cn/', '王志东'),
     4     ('163', 'http://www.163.com/', '丁磊')
     5 ]
     6 Website = namedtuple('Website', ['name', 'url', 'founder'])
     7 for website in websites:
     8     website = Website._make(website)
     9     print (website)
    10 
    11 >>>Website(name='Sohu', url='http://www.google.com/',founder='张朝阳')
    12 Website(name='Sina', url='http://www.sina.com.cn/', founder='王志东')
    13 Website(name='163', url='http://www.163.com/', founder='丁磊'

    =>deque(iterable,maxlen)

    deque其实是double-ended queue的缩写,翻译过来就是双端队列,它最大的好处就是实现了从队列头部快速增加和取出对象: .popleft(), .appendleft()。原生的List也能从头部添加和去除对象,l.insert(0, v)、l.pop(0)。但是值得注意的是,list对象的这两种用法的时间复杂度是O(n),也就是说随着元素数量的增加耗时呈线性上升。而使用deque对象则是O(1) 的复杂度,所以当你的代码有这样的需求的时候,一定要记得使用deque。

    作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate等。

    append(x):从队列末尾添加x

    appendleft(x):从队列头部添加x

    clear():清空队列

    count(x):返回队列中x的数量

    extend(iterable):在队列的尾部添加多个元素

    extendleft(iterable):在队列的头部添加多个元素,反序插入(字母表相反顺序)

    pop():将尾部一个元素移除

    popleft():将头部一个元素移除

    remove(x):将队列中第一次出现的x元素移除

    reverse():将队列元素逆置

    rotate(n):将队列尾部的n个元素添加到头部 rotate(1)等价于:d.appendleft(d.pop())

    D.maxlen:返回队列的长度,如果是无界则返回None(定义的时候可以指定maxlen,否则默认是无界队列)

    1 Example:
    2 >>>d=collections.deque("gsgwqeasas")
    3 >>> d
    4 deque(['g', 's', 'g', 'w', 'q', 'e', 'a', 's', 'a', 's'])
    5 >>> s=list(d)
    6 >>> s
    7 ['w', 'g', 'g', 's', 'a', 's', 'a', 'e', 'q']

    =>Counter(iterable or mapping)  #可迭代或者映射的对象

    计数器是一个非常常用的功能需求。

    elements():返回一个重复元素的迭代器,重复次数和计数的次数一样多。元素以任意顺序返回。如果一个元素的计数小于1,elements()会忽略它。

    most_common([n]):返回n个计数器元素,若未指定n,则返回计数器的所有元素

    update(iterable or mapping):增加计数器元素,元素可以来源于迭代对象或者一个Counter对象

     

     1 Example:
     2 >>> s
     3 ['w', 'g', 'g', 's', 'a', 's', 'a', 'e', 'q']
     4 >>> c=collections.Counter(s)
     5 >>> c
     6 Counter({'g': 2, 'a': 2, 's': 2, 'e': 1, 'q': 1, 'w': 1})
     7 >>> list(c)
     8 ['e', 'q', 'g', 'w', 'a', 's']
     9 >>> dict(c)
    10 {'a': 2, 'q': 1, 'g': 2, 'w': 1, 'e': 1, 's': 2}
    11 >>> list(c.elements())
    12 ['e', 'q', 'g', 'g', 'w', 'a', 'a', 's', 's']
    13 >>> c.most_common(4)
    14 [('g', 2), ('a', 2), ('s', 2), ('e', 1)]
    15 >>> c.update('fds')
    16 >>> c
    17 Counter({'s': 3, 'g': 2, 'a': 2, 'e': 1, 'q': 1, 'w': 1, 'f': 1, 'd': 1})
    18 >>> c.update(c)
    19 >>> c
    20 Counter({'s': 6, 'g': 4, 'a': 4, 'e': 2, 'q': 2, 'w': 2, 'f': 2, 'd': 2})
    21 >>>

    =>OrderedDict(items)

    在Python中,dict这个数据结构由于hash的特性,是无序的,这在有的时候会给我们带来一些麻烦, 幸运的是,collections模块为我们提供了OrderedDict,当你要获得一个有序的字典对象时,用它就对了。

    popitem(last=True):移除字典对象元素,last=True时“后进先出”,last=False时“先进先出”

    move_to_end(key,last=True):将字典中一个已经存在的键移动到头部或者尾部。last=True时,移动到尾部,last=False时,移动到头部。

     

     1 Example:
     2 >>> d
     3 {'w': 2, 'a': 4, 'f': 2, 'q': 2, 'g': 4, 'd': 2, 'e': 2, 's': 6}
     4 >>> n=collections.OrderedDict(d)
     5 >>> n
     6 OrderedDict([('w', 2), ('a', 4), ('f', 2), ('q', 2), ('g', 4), ('d', 2), ('e', 2), ('s', 6)])
     7 >>> n.popitem()
     8 ('s', 6)
     9 >>> n
    10 OrderedDict([('a', 4), ('f', 2), ('q', 2), ('g', 4), ('d', 2), ('e', 2)])
    11 >>> n.move_to_end('f')
    12 >>> n
    13 OrderedDict([('a', 4), ('q', 2), ('g', 4), ('d', 2), ('e', 2), ('f', 2)])

    =>defaultdict

    我们都知道,在使用Python原生的数据结构dict的时候,如果用 d[key] 这样的方式访问, 当指定的key不存在时,是会抛出KeyError异常的。

    但是,如果使用defaultdict,只要你传入一个默认的工厂方法,那么请求一个不存在的key时, 便会调用这个工厂方法使用其结果来作为这个key的默认值。

     1 Example:
     2 >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
     3 >>> d = defaultdict(list)
     4 >>> for k, v in s:     
     5     d[k].append(v)
     6 >>> list(d.items())
     7 [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
     8 
     9 >>> m =dict()
    10 >>> m["a"]
    11 Traceback (most recent call last):
    12 File"<stdin>", line1,in<module>
    13 KeyError: "a"
    14 >>>
    15 >>> m =collections.defaultdict(int)
    16 >>> m["a"]
    17 0
    18 >>> m["b"]
    19 0
    20 >>> m =collections.defaultdict(str)
    21 >>> m["a"]
    22 ""
    23 >>> m["b"]+="a"
    24 >>> m["b"]
    25 "a"
    26 >>> m =collections.defaultdict(lambda:"[default value]")
    27 >>> m["a"]
    28 "[default value]"
    29 >>> m["b"]
    30 "[default value]"
  • 相关阅读:
    linux下samba服务器的搭建(案列模拟)
    linux下nfs服务器的搭建
    linux 下 php+gd2+freetype+jpeg+png+zlib编译安装
    linux下xcache的安装
    wget如何设置代理
    实验记录:vsftp整合mysql-pam管理虚拟账号
    tr命令 实例
    sed学习笔记
    Byte、KB、MB、GB、TB、PB转换
    对lombbok @slf4j 进行测试用例
  • 原文地址:https://www.cnblogs.com/MrFiona/p/5958910.html
Copyright © 2011-2022 走看看