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

      1 1.namedtuple
      2 tuple可以用来表示不变集合,例如,一个点的二维坐标就可以表示成:p=(1,2)
      3 但是,看到(1, 2),很难看出这个tuple表示的是一个坐标。
      4 这时就可以使用nametuple来处理:
      5 from collections import namedtuple
      6 Point = namedtuple('Point', ['x', 'y'])
      7 p = Point(1, 2)
      8 print(p.x)
      9 print(p.y)
     10 1
     11 2
     12 
     13 namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。
     14 这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。
     15 格式:namedtuple('名称', [属性list])
     16 #用坐标和半径来表示一个圆
     17 Circle = namedtuple('Circle', ['x', 'y', 'r'])
     18 
     19 2.deque
     20 使用list列表存储数据时,按索引访问元素很快,但是插入和删除元素就比较慢,因为list是线性存储,数据量大的时候,插入和删除效率很低。
     21 deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
     22 from collections import deque
     23 q = deque(['a', 'b', 'c'])
     24 q.append('x')
     25 q.appendleft('y')
     26 q.pop()
     27 q.popleft()
     28 print(q)
     29 输出如下:
     30 deque(['y', 'a', 'b', 'c', 'x'])
     31 deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
     32 
     33 3.defaultdict
     34 使用list列表存储数据时,按索引访问元素很快,但是插入和删除元素就比较慢,因为list是线性存储,数据量大的时候,插入和删除效率很低。
     35 deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
     36 from collections import deque
     37 q = deque(['a', 'b', 'c'])
     38 q.append('x')
     39 q.appendleft('y')
     40 print(q)
     41 输出如下:
     42 deque(['y', 'a', 'b', 'c', 'x'])
     43 deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
     44 
     45 4.OrderedDict
     46 使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
     47 如果要保持Key的顺序,可以用OrderedDict:
     48 from collections import OrderedDict
     49 d = dict([('a', 1), ('b', 2), ('c', 3)])
     50 print(d) # dict的Key是无序的
     51 {'a': 1, 'c': 3, 'b': 2}
     52 od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
     53 print(od) # OrderedDict的Key是有序的
     54 OrderedDict([('a', 1), ('b', 2), ('c', 3)])
     55 
     56 注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:
     57 from collections import OrderedDict
     58 od = OrderedDict()
     59 od['z'] = 1
     60 od['y'] = 2
     61 od['x'] = 3
     62 print(od.keys())
     63 odict_keys(['z', 'y', 'x'])
     64 print(list(od.keys())) # 按照插入的Key的顺序返回
     65 输出 : ['z', 'y', 'x']
     66 
     67 OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:
     68 from collections import OrderedDict
     69 class LastUpdatedOrderedDict(OrderedDict):
     70 
     71     def __init__(self, capacity):
     72         super(LastUpdatedOrderedDict, self).__init__()
     73         self._capacity = capacity
     74 
     75     def __setitem__(self, key, value):
     76         containsKey = 1 if key in self else 0
     77         if len(self) - containsKey >= self._capacity:
     78             last = self.popitem(last=False)
     79             print('remove:', last)
     80         if containsKey:
     81             del self[key]
     82             print('set:', (key, value))
     83         else:
     84             print('add:', (key, value))
     85         OrderedDict.__setitem__(self, key, value)
     86 
     87 
     88 from collections import OrderedDict
     89 class LastUpdatedOrderedDict(OrderedDict):
     90 
     91     def __init__(self, capacity):
     92         super(LastUpdatedOrderedDict, self).__init__()
     93         #设置字典容量
     94         self._capacity = capacity
     95         #print(self._capacity)  3
     96 
     97     def __setitem__(self, key, value):
     98         #判断,如果key在当前实例中,返回1否则返回0
     99         containsKey = 1 if key in self else 0
    100         #判断,如果元素的个数-1或-0大于等于3,就需要删除前面的元素了
    101         if len(self) - containsKey >= self._capacity:
    102             print(len(self),self._capacity)
    103             last = self.popitem(last=False)
    104             print('remove:', last)
    105         #如果key在当前实例中,则删除key对应的值,从新赋值
    106         if containsKey:
    107             del self[key]
    108             print('set:', (key, value))
    109         #否则只进行添加
    110         else:
    111             print('add:', (key, value))
    112         #使用OrderedDict的__setitem__方法设置key和value
    113         OrderedDict.__setitem__(self, key, value)
    114 if __name__=='__main__':
    115     luod=LastUpdatedOrderedDict(3)
    116     luod['key1']=4
    117     #print(luod.__dict__)
    118     luod['key2']=5
    119     luod['key3']=6
    120     luod['key4']=7
    121     luod['key1']=8
    122     luod['key1']=9
    123     print(list(luod.items()))
    124 
    125 #add: ('key1', 4)
    126 # add: ('key2', 5)
    127 # add: ('key3', 6)
    128 # 3 3
    129 # remove: ('key1', 4)
    130 # add: ('key4', 7)
    131 # 3 3
    132 # remove: ('key2', 5)
    133 # add: ('key1', 8)
    134 # set: ('key1', 9)
    135 # [('key3', 6), ('key4', 7), ('key1', 9)]
    136 
    137 
    138 5.Counter
    139 Counter是一个简单的计数器,目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。
    140 例如,统计字符出现的个数:
    141 from collections import Counter
    142 c = Counter()
    143 for ch in 'programming':
    144     c[ch] = c[ch] + 1
    145     print(c)
    146 Counter实际上也是dict的一个子类,上面的结果可以看出,字符'g''m''r'各出现了两次,其他字符各出现了一次。



    2019-02-23

  • 相关阅读:
    Spark运行模式_基于YARN的Resource Manager的Client模式(集群)
    Spark运行模式_spark自带cluster manager的standalone cluster模式(集群)
    Spark运行模式_Spark自带Cluster Manager的Standalone Client模式(集群)
    Spark运行模式_本地伪集群运行模式(单机模拟集群)
    Spark运行模式_local(本地模式)
    Spark_安装配置_运行模式
    二叉树的非递归遍历算法
    142. Linked List Cycle II
    139. Word Break
    136. Single Number
  • 原文地址:https://www.cnblogs.com/zpdbkshangshanluoshuo/p/10423180.html
Copyright © 2011-2022 走看看