Python — collection

collection 數據容器

        Python擁有一些內置的數據類型,比如str, int, list, tuple, dict等, collections

模塊在這些內置數據類型的基礎上,提供了幾個額外的數據類型:

    namedtuple()。創建有名字域的元組子類的工廠函數。python 2.6新增。

    deque:雙端隊列,類似於列表,兩端進棧和出棧都比較快速。python 2.4新增。

    Counter:字典的子類,用於統計哈希對象。python 2.7新增。

    OrderedDict:字典的子類,記錄了添加順序。python 2.7新增。

    defaultdict:dict的子類,調用一個工廠函數支持不存在的值。python 2.5新增。

    還提供了抽象基類,用來測試類是否提供了特殊接口,比如是哈希或者映射。

class {typename}(tuple):   # 可命名元祖      '{typename}({arg_list})'

        namedtuple主要用來產生可以使用名稱來訪問元素的數據對象,通常用來增強代碼的可

        讀性, 在訪問一些tuple類型的數據時尤其好用。

    def _make(cls, iterable, new=tuple.__new__, len=len):

from collections import namedtuple

            websites = [                          ('Sohu', 'http://www.google.com/', '張朝陽'),                          ('Sina', 'http://www.sina.com.cn/', '王志東'),                          ('163', 'http://www.163.com/', '丁磊')                          ]              Website = namedtuple('Website', ['name', 'url', 'founder'])              for website in websites:                  website = Website._make(website)                  print(website)

               結果如下:

                Website(name='Sohu', url='http://www.google.com/', founder='張朝陽')

                Website(name='Sina', url='http://www.sina.com.cn/', founder='王志東')

                Website(name='163', url='http://www.163.com/', founder='丁磊')

    def _replace(_self, **kwds):
    def _asdict(self):

class Counter(dict):  # 計數器

     Counter() 的可用方法如下:

    def most_common(self, n=None): # 獲取出現頻率最高的幾個元素

    def elements(self):   # 獲取所有元素

      例:

        import collections

        c1=collections.Counter ('sdfsdgasdhgd')

        print c1

        print c1.most_common(3)

        for i in c1.elements():

                print i

        C:Python27python.exe "E:/python-file/learn – python.py"

        Counter({'d': 4, 's': 3, 'g': 2, 'a': 1, 'f': 1, 'h': 1})

        [('d', 4), ('s', 3), ('g', 2)]

        a

        d

        d

        d

        d

        g

        g

        f

        h

        s

        s

        s

        Process finished with exit code 0

    def update(*args, **kwds): # 有新添加的就添加到 collections.Counter()

            >>> c1

            Counter({'d': 4, 's': 3, 'g': 2, 'h': 1, 'f': 1, 'a': 1})

            >>> c2

            Counter({'a': 2, 'd': 1, 'c': 1, 'b': 1})

            >>> c1.update(c2)

            >>> c1

            Counter({'d': 5, 's': 3, 'a': 3, 'g': 2, 'h': 1, 'c': 1, 'b': 1, 'f': 1})

    def subtract(*args, **kwds):   # 相減 後 添加到  collections.Counter()

            >>> c1

            Counter({'d': 5, 's': 3, 'a': 3, 'g': 2, 'h': 1, 'c': 1, 'b': 1, 'f': 1})

            >>> c1.subtract(c2)

            >>> c1

            Counter({'d': 4, 's': 3, 'g': 2, 'h': 1, 'f': 1, 'a': 1, 'c': 0, 'b': 0})

    def copy(self):  # 淺層copy,只拷貝一層如有多層則一層之下默認指向深層地址

class OrderedDict(dict):  #  # 有序字典

                區別無序字典及有序字典的實例:

    import collections

    c1=collections.OrderedDict ()

    c1['k1']=1

    c1['k3']=1

    c1['k5']=1

    c1['k2']=1

    print c1

    c1={}

    c1['k1']=1

    c1['k3']=1

    c1['k5']=1

    c1['k2']=1

    print c1

    結果如下:

    OrderedDict([('k1', 1), ('k3', 1), ('k5', 1), ('k2', 1)])     —有序字典

{'k3': 1, 'k2': 1, 'k1': 1, 'k5': 1} —無序字典

    自定義有序字典,字典變成有序的字典

    c1={}

    c1['k1']=1

    c1['k3']=3

    c1['k5']=5

    c1['k2']=2

    print c1

    li=['k1','k2','k3','k5']

    for i in li:

        print c1[i]                               

    C:Python27python.exe "E:/python-file/learn – python.py"

    {'k3': 3, 'k2': 2, 'k1': 1, 'k5': 5}

    1

    2

    3

    5

    Process finished with exit code 0

     有序字典方法,默認繼承無序字典方法,如下:

    def clear(self): #  默認清除所有元素

            >>> c2

            OrderedDict([(0, 2), (1, 2), (2, 2)])

            >>> c2.clear()

            >>> c2

            OrderedDict()

    def copy(self): #  淺copy

            >>> c2 = c1.copy()

            >>> c2

            OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1))

    def fromkeys(cls, S, v=None): # (參見字典類)

            >>> c2=c1.fromkeys((i for i in range(3)),2)

            >>> c2

            OrderedDict([(0, 2), (1, 2), (2, 2)])

    def items(self, *args, **kwargs): #  有序字典同樣具有字典的方法

            >>> c1

            OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])

            >>> c1.items()

            odict_items([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])

    def keys(self, *args, **kwargs): # 有序字典中所有元素的key值

            >>> c1

            OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])

            >>> c1.keys()

            odict_keys(['k4', 'k2', 'k3', 'k5'])

    def move_to_end(self, *args, **kwargs): # 將某一元素移到最後

            >>> c1

            OrderedDict([('k4', 1), ('k5', 1), ('k2', 1), ('k3', 1)])

            >>> c1.move_to_end('k5')

            >>> c1

            OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])

    def pop(self, k, d=None): #   刪除某一元素,需要添加key值(見popitem)

    def popitem(self): #  刪除元素,默認從最後刪除無序添加key值

            >>> c1

            OrderedDict([('k4', 1), ('k5', 1), ('k2', 1), ('k3', 1), ('k1', 1)])

            >>> c1.popitem()

            ('k1', 1)

            >>> c1.pop()

            Traceback (most recent call last):

              File "<stdin>", line 1, in <module>

            TypeError: Required argument 'key' (pos 1) not found

    def setdefault(self, k, d=None): # 添加元素設置默認值,默認第二個參數為None

            >>> c1.setdefault(2,'v2')

            'v2'

            >>> c1

            OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1), (2, 'v2')])

    def update(self, *args, **kwargs): # 更新有序字典

            >>> c1

            OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])

            >>> c2

            OrderedDict([(0, 2), (1, 2), (2, 2)])

            >>> c1.update(c2)

            >>> c1

            OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1), (0, 2), 

                        (1, 2), (2, 2)])

    def values(self, *args, **kwargs): # 有序字典中所有元素的values值

            >>> c1

            OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])

            >>> c1.values()

            odict_values([1, 1, 1, 1])

class deque(object):  # 雙向隊列

    def append(self, *args, **kwargs): # 右側添加

            >>> d2

            deque([ '>', '-', '-', '-', '<'])

            >>> d2.append('-')

            deque([ '>', '-', '-', '-', '<','-'])

    def appendleft(self, *args, **kwargs): # 左側添加

             >>> d2

            deque([ '>', '-', '-', '-', '<'])

            >>> d2.appendleft('-')

            deque([ '-','>', '-', '-', '-', '<'])

    def clear(self, *args, **kwargs): # 清除所有元素

    def copy(self, *args, **kwargs): #   淺層copy

            >>> d2

            deque([ '>', '-', '-', '-', '<'])

            >>> d3=d2.copy()

    def count(self, value): # 

            >>> d2

            deque([ '>', '-', '-', '-', '<'])

            >>> d2.count('-')

            3

    def extend(self, *args, **kwargs): # 右側擴展

            >>> d3

            deque(['1', '2', '3'])

            >>> d2

            deque([ '>', '-', '-', '-', '<'])

            >>> d2.extendleft(d3)

            >>> d2

            deque([ '>', '-', '-', '-','<','1', '2', '3'])

    def extendleft(self, *args, **kwargs): # 左側擴展

            >>> d3

            deque(['1', '2', '3'])

            >>> d2

            deque([ '>', '-', '-', '-', '<'])

            >>> d2.extendleft(d3)

            >>> d2

            deque(['3','2', '1', '>', '-', '-', '-','<'])

   def index(self, value, start=None, stop=None): # 索引

            >>> d2

            deque(['3', ',', '2', ',', '1', '–', '>', '-', '-', '-', '-','<'])

            >>> d2.index('2')

            2

    def insert(self, index, p_object): # 可在指定位置插入

            >>> d3

            deque(['1', '2', '3'])

            >>> d3.insert(1,'4')

            >>> d3

            deque(['1', '4', '2', '3'])

    def pop(self, *args, **kwargs): #  右側刪除

            >>> d3

            deque(['1', '4', '2', '3'])

            >>> d3.pop()

            '3'

    def popleft(self, *args, **kwargs): # 左側刪除

            >>> d3.popleft()

            '1'

            >>> d3

            deque(['4', '2'])

    def remove(self, value): #  刪除某一元素,需要加參數

            >>> d3.remove('4')

            >>> d3

            deque(['2'])

    def reverse(self): #  反轉  

            >>> d3

            deque(['1', '2', '3'])

            >>> d3.reverse()

            >>> d3

            deque(['3', '2', '1'])

    def rotate(self, *args, **kwargs): #  下面這個是一個有趣的例子,主要使用了

                    deque的rotate方法來實現了一個無限循環的加載動畫       

    import sys

                        import  time

                        from collections import deque

                        de = deque('>————<')

           while True:

                                print('r %s ' % (''.join(de)))

                de.rotate(1)

                sys.stdout.flush()

                time.sleep(1)

          結果如下:

             >————< 

             <>———— 

             -<>———– 

             –<>———- 

             —<>———