1. 程式人生 > >Python collections內建集合模組

Python collections內建集合模組

Python collections內建集合模組

  • collections 是 Python內建的一個集合模組,提供了許多有用的集合類。

1、namedtuple:

  • tuple可以表示不變集合,例如,一個二維座標就可以表示成:

    p = (1, 2)
    
  • 看到(1, 2)很不容易看出來這是一個二維座標,定義一個class又小題大做,這時namedtuple就派上用場了:

    import collections
    Point = collections.namedtuple('Point', ['x', 'y'])
    p = Point(1, 2)
    print
    (p.x) print(p.y) # 輸入結果如下: 1 2
  • namedtuple是一個函式,它用來建立一個自定義的tuple物件,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素

  • 我們可以用namedtuple很方便的定義一種資料型別,它具備tuple的不變性,又可以根據屬性來引用。

  • 驗證建立的Point物件是tuple的一種子類:

    >>> isinstance(p, Point)
    True
    >>> isinstance(p, tuple)
    True
    
  • 如果要用座標和半徑表示一個圓,也可以用namedtuple

    定義:

    import collections
    Circle = collections.namedtuple('Circle', ['x', 'y', 'r'])
    c = Circle(1, 2, 3)
    print(c.x)
    print(c.y)
    print(c.r)
    
    print(isinstance(c, Circle))
    print(isinstance(c, tuple))
    # 輸出結果如下:
    1
    2
    3
    True
    True
    

2、deque:

  • 使用list儲存資料時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為**list是線性儲存,資料量大的時候,插入和刪除效率很低

    **

  • deque是為了高效實現插入和刪除操作的雙向列表

    import collections
    q = collections.deque(['a', 'b', 'c'])
    q.append('x')  # 預設是新增尾部
    q.appendleft('y')  # 從左邊進行新增
    print(q)
    # 輸出結果如下:
    deque([u'y', u'a', u'b', u'c', u'x'])
    
  • deque除了實現list的append()pop()外,還支援appendleft()和popleft(),這樣就可以非常高效地往頭部新增或者刪除元素。

3、defaultdict:

  • 使用dict時,如果引用的key不存在,就會丟擲KeyError如果希望key不存在時,返回一個預設值,就可以用defaultdict

    import collections
    dd = collections.defaultdict(lambda: None)
    dd['key1'] = 'abc'
    print(dd['key1'])  # key1存在
    # abc
    print(dd['key2'])  # key2 不存在返回預設值
    # None
    
  • 注意:預設值是呼叫函式時返回的,而函式在建立defaultdict物件時傳入。

  • 除了在key不存在時返回預設值,defaultdict的其他行為跟dict是完全一樣的

4、OrderedDict:

  • 使用dict時,key是無序的。在對dict做迭代時,我們無法確定Key順序。

  • 如果要保持Key的順序,可以用OrderedDict:

    import collections
    
    my_dict = dict([('a', 1), ('b', 2), ('c', 3)])
    print(my_dict)  # dict的key是無序的
    
    od = collections.OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    print(od)  # OrderedDict的key 是有序的
    
    # 輸出結果如下:
    {u'a': 1, u'c': 3, u'b': 2}
    OrderedDict([(u'a', 1), (u'b', 2), (u'c', 3)])
    
  • 注意:orderedDict的key會按照插入的順序排列,不是key本身排序。

    import collections
    op = collections.OrderedDict()
    op['x'] = 1
    op['y'] = 2
    op['z'] = 3
    print(op)
    # 輸出結果如下:
    OrderedDict([(u'x', 1), (u'y', 2), (u'z', 3)])  # 按照插入的key順序返回
    
    my_dict = {}
    my_dict['x'] = 1
    my_dict['y'] = 2
    my_dict['z'] = 3
    print(my_dict)
    # 輸出結果如下:
    {u'y': 2, u'x': 1, u'z': 3}
    

5、Counter:

  • counter是一個簡單的計數器,例如,統計字元出現的個數:

    import collections
    
    c = collections.Counter()
    for ch in 'character':
        c[ch] = c[ch] + 1
        
    print(c)
    # 輸出結果如下:
    Counter({u'a': 2, u'c': 2, u'r': 2, u'e': 1, u'h': 1, u't': 1})
    
  • Counter實際上也是dict的一個子類,上面的結果可以看出,字元a,c,r出現了2次,其他的各出現1次。