美文网首页
Python collections模块中的几种数据结构

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

作者: 芒果菠萝蛋炒饭 | 来源:发表于2019-02-17 23:43 被阅读0次

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

相关文章

网友评论

      本文标题:Python collections模块中的几种数据结构

      本文链接:https://www.haomeiwen.com/subject/txcoeqtx.html