前言
Python為我們提供了4種基本的數據結構:list, tuple, dict, set,但是在處理數據量較大的情形的時候,這4種數據結構就明顯過于單一了,比如list作為數組在某些情形插入的效率會比較低,有時候我們也需要維護一個有序的dict。所以這個時候我們就要用到Python標準庫為我們提供的collections包了,它提供了多個有用的集合類,熟練掌握這些集合類,不僅可以讓我們讓寫出的代碼更加Pythonic,也可以提高我們程序的運行效率。
defaultdict
defaultdict(default_factory)在普通的dict之上添加了default_factory,使得key不存在時會自動生成相應類型的value,default_factory參數可以指定成list, set, int等各種合法類型。
我們現在有下面這樣一組list,雖然我們有5組數據,但是仔細觀察后發現其實我們只有3種color,但是每一種color對應多個值。現在我們想要將這個list轉換成一個dict,這個dict的key對應一種color,dict的value設置為一個list存放color對應的多個值。我們可以使用defaultdict(list)來解決這個問題。
>>> from collections import defaultdict>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]>>> d = defaultdict(list)>>> for k, v in s:... d[k].append(v)...>>> sorted(d.items())[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]以上等價于:
>>> d = {}>>> for k, v in s:... d.setdefault(k, []).append(v)...>>> sorted(d.items())[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]如果我們不希望含有重復的元素,可以考慮使用defaultdict(set) 。set相比list的不同之處在于set中不允許存在相同的元素。
>>> from collections import defaultdict>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]>>> d = defaultdict(set)>>> for k, v in s:... d[k].add(v)...>>> sorted(d.items())[('blue', {2, 4}), ('red', {1, 3})]OrderedDict
Python3.6之前的dict是無序的,但是在某些情形我們需要保持dict的有序性,這個時候可以使用OrderedDict,它是dict的一個subclass,但是在dict的基礎上保持了dict的有序型,下面我們來看一下使用方法。
>>> # regular unsorted dictionary>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}>>> # dictionary sorted by key>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])>>> # dictionary sorted by value>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])>>> # dictionary sorted by length of the key string>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
新聞熱點
疑難解答