zoukankan      html  css  js  c++  java
  • [ Collections 学习02 ] collections

    Collections

    【资源Links】:https://docs.python.org/2/library/collections.html

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

      1:namedtuple():生成可以使用名字来访问元素内容的tuple子类;

      2:deque:双端队列,可以快速的从另外一侧追加和推出对象;

      3:Counter:计数器,主要用来计数;

      4:OrderdDict:有序字典;

      5:defaultdict:带有默认值的字典;

    一、namedtuple()

      namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性,在访问一些tuple类型的数据时尤其好用。

     1 # -*- coding:utf-8 -*-
     2 """
     3 比如我们用户拥有一个这样的数据结构,每一个对象是拥有三个元素的tuple。
     4 使用namedtuple方法就可以方便的通过tuple来生成可读性更高也更好用的数据结构。
     5 """
     6 from collections import namedtuple
     7 websites=[
     8     ('Sohu', 'http://www.google.com/', u'张朝阳'),
     9     ('Sina', 'http://www.sina.com.cn/', u'王志东'),
    10     ('163', 'http://www.163.com/', u'丁磊')
    11 ]
    12 Website=namedtuple('Website',['name','url','founer'])
    13 for website in websites:
    14     website=Website._make(website)
    15     print website
    16 
    17 # results
    18 Website(name='Sohu', url='http://www.google.com/', founer=u'u5f20u671du9633')
    19 Website(name='Sina', url='http://www.sina.com.cn/', founer=u'u738bu5fd7u4e1c')
    20 Website(name='163', url='http://www.163.com/', founer=u'u4e01u78ca')

    二、deque

      deque其实是double-ended queue的缩写,翻译过来就是双端队列,它最大的好处就是现实了从队列头部快速增加和取出对象:popleft()、appendleft()。

      原声的list也可以从头部添加和取出对象,但是值得注意的是,list对象的两种方法的时间复杂度是O(n),也就是说随着袁术数量的增加耗时呈线性上升。而使用deque对象则是O(1)的复杂度,所以当你的代码有这样的需求的时候,一定要记得使用deque。

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

    # -*- coding: utf-8 -*-
    """
    下面这个是一个有趣的例子,主要使用了deque的rotate方法来实现了一个无限循环
    的加载动画
    """
    import sys
    import time
    from collections import deque
    fancy_loading = deque('>--------------------')
    while True:
        print '
    %s' % ''.join(fancy_loading),
        fancy_loading.rotate(1)
        sys.stdout.flush()
        time.sleep(0.08)

    三、Counter

      计数器是一个非常常用的功能需求,collections也贴心的为你提供了这个功能。

    # -*- coding:utf-8 -*-
    """
    下面这个例子就是使用Counter模块统计一段句子里面所有字符出现的次数
    """
    from collections import Counter
    s = '''A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.'''.lower()
    c=Counter(s)
    # 获取出现频率最高的10个字符
    print c.most_common(10)
    
    # results
    [(' ', 54), ('e', 32), ('s', 25), ('a', 24), ('t', 24), ('o', 22), ('n', 21), ('i', 20), ('r', 20), ('c', 15)]

    四、OrderedDict

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

     # -*- coding:utf-8 -*-
    from collections import OrderedDict
    items=(
        ('A',1),
        ('B',2),
        ('C',3)
    )
    regular_dict=dict(items)
    ordered_dict=OrderedDict(items)
    print 'Regular Dict:'
    for k,v in regular_dict.items():
        print k,v
    
    print 'Ordered Dict:'
    for k,v in ordered_dict.items():
        print k,v
    
    # results
    Regular Dict:
    A 1
    C 3
    B 2
    Ordered Dict:
    A 1
    B 2
    C 3

    五、defaultdict

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

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

     # -*- coding:utf-8 -*-
    from collections import defaultdict
    members= [
        # Age, name
        ['male', 'John'],
        ['male', 'Jack'],
        ['female', 'Lily'],
        ['male', 'Pony'],
        ['female', 'Lucy'],
    ]
    results=defaultdict(list)
    for sex,name in members:
        results[sex].append(name)
    print results
    
    # results
    defaultdict(<type 'list'>, {'male': ['John', 'Jack', 'Pony'], 'female': ['Lily', 'Lucy']})

      上面只是非常简单的介绍了一下collections模块的主要内容,主要目的就是当你碰到适合使用它们的场所时,能够记起并使用它们,起到事半功倍的效果。

      如果要对它们有一个全面和深入了解的话,还是建议阅读官方文档和模块源码。

      

     

      

     

  • 相关阅读:
    怎样在delphi中实现控件和窗体的拖拽
    Ecshop出现问题 includeslib_main.php on line 1329 includeslib_base.php on line
    Scrollbox的滚动条事件scrollbar事件的处理(Lazarus)
    TControl.WMLButtonUp的inherited的作用——是为了给子类控件新的处理消息的机会
    信号槽的被连接几次,就会执行几次(有空要仔细研究connect的各种用法)
    追踪CM_CONTROLCHANGE消息的产生和执行过程,可以较好的领会VCL的思想(就是到处通知,但耦合性很弱)
    TControl的显示函数(5个非虚函数,4个虚函数)和三个例子的执行过程(包括SetParent的例子)
    js广告轮询效果
    TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)
    Delphi控件的透明与不透明(要挨个解释一下原因),对InvalidateControl的关键理解
  • 原文地址:https://www.cnblogs.com/pythonMLer/p/6255471.html
Copyright © 2011-2022 走看看