Python collections模块中的几种数据结构

Python collections模块中的几种数据结构

namedtuple

  • namedtuple 是一种类似于元组的数据类型,除了 tuple 的一些用法之外,还能更方便地通过属性名来访问数据
In[1]: from collections import namedtuple
In[2]: Person = namedtuple('Person', ['name', 'age',  'phone'])
In[3]: me = Person(name='me', age='1', phone=123465)
In[4]: me
Out[4]: Person(name='me', age='1', phone=123465)

从上面的例子中可以看出,当使用 nametuple 通过属性访问数据时,能让我们的代码更好维护(与索引相比)

def fun1():
    ...
    return code, message

code, message = fun1()


Result = namedtuple('Recult', ['code', 'success'])
def fun2():
    ...
    return Result(code=0, message='success')

result = func2()

从上面两种函数的返回方式来看,第二种的可读性是比第一种好的,尤其是当一次返回多个数据,又不想将返回结果封装成一个 class的时候,可以使用 nametuple

  • 不可变

    • tuple 类似,namedtuple的属性是不可变的
    In[5]: me.age += 1
    Traceback (most recent call last):
    File "/home/liujinxuan/Virtualenv/venv/local/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2878, in run_code
        exec(code_obj, self.user_global_ns, self.user_ns)
    File "<ipython-input-6-99c261b82013>", line 1, in <module>
        me.age += 1
    TypeError: cannot concatenate 'str' and 'int' objects
    
  • 更多用法,参考 https://docs.python.org/2/library/collections.html#collections.namedtuple

deque

  • deque 对象类似于list列表,不过你可以操作它的“两端”, 是一个高效实现插入和删除操作的双向列表,适合用于队列和栈

    In[1]: from collections import deque
    In[2]: q = deque()
    In[3]: q.append(0)
    In[4]: q.append(1)
    In[5]: q
    Out[5]: deque([0, 1])
    In[6]: q.appendleft(2)
    In[7]: q
    Out[7]: deque([2, 0, 1])
    In[8]: q.pop()
    Out[8]: 1
    In[9]: q.popleft()
    Out[9]: 2
    
  • 我们可以从任一端扩展这个队列中的数据:

    In[10]: d.extendleft([d.extend([6,7,8])])
    Out[10]: deque([6, 7, 8, 0])
    
  • 我们也可以设置 deque 的大小,当元素数量超出设定的限制时,数据会从另一端被 pop 出去

    In[11]: d = deque(maxlen=5)
    In[11]: d.extend([6, 7, 8, 0])
    In [12]: d
    Out[13]: deque([6, 7, 8, 0, 1])
    In [14]: d.append(2)
    In [15]: d
    Out[15]: deque([7, 8, 0, 1, 2])
    In [16]: d.appendleft(6)
    In [17]: d
    Out[17]: deque([6, 7, 8, 0, 1])
    
    
  • 更多用法, 参考 https://docs.python.org/2/library/collections.html#collections.deque

defaultdict

  • defaultdict 的用法与 dict 类似, 不同的是, 当访问 defaultdict 中不存在的值时,会返回一个默认值,而不是向 dict 引发KeyError异常

  • defaultdict 类的初始化函数接受一个类型作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值:

    In [1]: from collections import defaultdict
    In [2]: d = defaultdict(list)
    In [3]: d['not_exist_key']
    Out[3]: []
    In [4]: def init_value():
        ...:     return 0
        ...: 
    In [5]: d = defaultdict(init_value)
    In [6]: d['not_exist_key']
    Out[6]: 0
    
  • 这种形式的默认值只有在通过 dict[key] 或者 dict.__getitem__(key) 访问的时候才有效

    >>> from collections import defaultdict
    >>> print defaultdict.__missing__.__doc__
    __missing__(key) # Called by __getitem__ for missing key; pseudo-code:
    if self.default_factory is None: raise KeyError((key,))
    self[key] = value = self.default_factory()
    return value
    

    defaultdict 实现了 __missing__ 方法, __missing__ 方法的作用是当使用 __getitem__() 方法访问一个不存在的键时( dict[key] 这种形式实际上是 __getitem__() 方法的简化形式),会调用 __missing__() 方法获取默认值,并将该键添加到字典中去。

  • 更多用法参考 https://docs.python.org/2/library/collections.html#collections.defaultdict

Counter

  • Counter是一个简单的计数器,帮助我们针对某项数据进行计数。
    In [1]: from collections import Counter
    In [2]: s = '''HangZhou lukou'''
    In [3]: c = Counter(s)
    In [4]: c
    Out[4]: 
    Counter({' ': 1,
            'H': 1,
            'Z': 1,
            'a': 1,
            'g': 1,
            'h': 1,
            'k': 1,
            'l': 1,
            'n': 1,
            'o': 2,
            'u': 3})
    In [5]: c.most_common(5)  #   出现次数最多的 5个字符
    Out[5]: [('u', 3), ('o', 2), ('a', 1), (' ', 1), ('g', 1)]   
    
  • 更多用法参考 https://docs.python.org/2/library/collections.html#collections.Counter

OrderedDict

  • Python中的 dict 是通过计算 key 的哈希值来确定存储位置的,因此存在 dict 中的数据是无序的,当我们需要获得一个有序的字典对象时,可以使用 OrderedDict, OrderedDict中的数据会按照插入的顺序排序
    In [1]: from collections import OrderedDict
    In [2]: od = OrderedDict()
    In [3]: od['b'] = 1
    In [4]: od['a'] = 1
    In [5]: od['c'] = 1
    In [6]: od
    Out[6]: OrderedDict([('b', 1), ('a', 1), ('c', 1)])
    
    
  • 如果某个key对应的值改变了,顺序不变。
    In [7]: od['a'] = 2
    In [8]: od
    Out[8]: OrderedDict([('b', 1), ('a', 2), ('c', 1)])
    
  • 在比较两个OrderDict时,OrderedDict要内容和顺序完全相同才会视为相等。
  • 更多用法参考 https://docs.python.org/2/library/collections.html#collections.OrderedDict
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 常用模块 认识模块 什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文...
    go以恒阅读 1,938评论 0 6
  • 简介 collections包含了一些特殊的容器,针对Python内置的容器,例如list、dict、set和tu...
    Boer223阅读 13,568评论 0 11
  • 原文:http://python.jobbole.com/80847/ 在Python中有一些内置的数据类型,比如...
    阳光小镇少爷阅读 752评论 0 1
  • The Python Data Model If you learned another object-orien...
    plutoese阅读 1,710评论 0 51
  • 大胆去做不敢做的事,虽然胆怯,但做了就有收获。当你变得不再胆怯,你就又成长了。每天看着别人的成功事迹,受到的只是一...
    黑白月光阅读 251评论 0 1