0x00:創(chuàng)建一鍵多值字典
字典是Python中的一種可變?nèi)萜鳎ǔR赃@種形式出現(xiàn):
d = {key1:value1, key2:value2, key3:value3}
Python沒有規(guī)定字典中值的類型,所以如果想讓字典中的一個(gè)鍵對(duì)應(yīng)多個(gè)值,只要把這些值放到列表這樣的容器里就行了。
student = {
'a': [76, 54, 82],
'b': [92, 67, 88]
}
為了方便創(chuàng)建這樣的字典,可以使用
collections
模塊中的
defaultdict
類。一般在訪問一個(gè)字典中不存在的key時(shí)會(huì)報(bào)錯(cuò),defaultdict類則會(huì)自動(dòng)初始化一個(gè)默認(rèn)值。使用defaultdict可以這樣創(chuàng)建一個(gè)值為列表的字典:
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['a'].append(3)
0x01:有序字典
Python中字典的key是不記錄順序的,如果我們想在對(duì)字典進(jìn)行迭代或者序列化操作時(shí)掌握元素的順序,可以使用
collections
模塊中的
OrderedDict
類。
>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['a'] = 1
>>> d['b'] = 2
>>> d['c'] = 3
>>> for key in d:
... print(key, d[key])
...
a 1
b 2
c 3
OrderedDict內(nèi)部維護(hù)了一個(gè)雙向鏈表,每當(dāng)字典中創(chuàng)建新元素,就會(huì)被放到鏈表的末尾。對(duì)已存在的鍵重新賦值不會(huì)改變鍵的順序。由于OrderedDict創(chuàng)建了額外的鏈表,所以占用空間會(huì)比普通的字典要多。使用這個(gè)類要注意取舍。
0x02:對(duì)序列去重但保持順序不變
要想去除一個(gè)列表中的重復(fù)項(xiàng),只需要使用
set()
就可以了,set創(chuàng)建一個(gè)無重復(fù)項(xiàng)的集合,可以對(duì)其求交集、并集等操作。但是,這種集合對(duì)象是無序的。
>>> a = [1, 4, 6, 1, 2, 1, 3, 6, 2]
>>> b = set(a)
>>> b
{1, 2, 3, 4, 6}
如果你既想要去除重復(fù)項(xiàng),又想保留順序,可以通過
set()
加生成器的方式解決:
def dedupe(items):
seen = set()
for item in items:
if item in items:
if item not in seen:
yield item
seen.add(item)
這只有當(dāng)序列中的元素是不可變對(duì)象時(shí)起作用,例如整數(shù)、字符串、元組。如果要應(yīng)用在列表這類可變?nèi)萜魃希獙?duì)代碼稍作修改:
def dedupe(items):
seen = set()
for item in items:
val = item if key is None else key(item)
if val not in seen:
yield item
seen.add(val)
這里使用key參數(shù)來指定一個(gè)函數(shù)將序列中元素轉(zhuǎn)變?yōu)椴豢勺冾愋汀?
0x03:統(tǒng)計(jì)元素的數(shù)量
如何找出一本書中出現(xiàn)頻率最高的單詞呢?或者想知道一個(gè)列表中相同元素出現(xiàn)的次數(shù)應(yīng)該怎么做?使用
collections
模塊中的
Counter
類可以輕松做到。
>>> from collections import Counter
>>> words = ['apple', 'keys', 'double', 'dude', 'eye', 'love', 'magic', 'double', 'magic', 'spell', 'apple', 'point', 'apple']
>>> count = Counter(words)
>>> count
Counter({'apple': 3, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1})
還可以使用Counter類的
most_common
方法來求排名前幾的元素:
>>> top = count.most_common(3)
>>> print(top)
[('apple', 3), ('double', 2), ('magic', 2)]
>>>
另外,Counter對(duì)象還可以做數(shù)學(xué)運(yùn)算:
>>> words = ['apple', 'keys', 'double', 'dude', 'eye', 'love', 'magic', 'double', 'magic', 'spell', 'apple', 'point', 'apple']
>>> other = ['apple', 'cool', 'duck', 'cookie']
>>> a = Counter(words)
>>> b = Counter(other)
>>> a
Counter({'apple': 3, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1})
>>> b
Counter({'apple': 1, 'cool': 1, 'duck': 1, 'cookie': 1})
>>> a + b
Counter({'apple': 4, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1, 'cool': 1, 'duck': 1, 'cookie': 1})
>>>
Counter
類能夠幫助我們很好地對(duì)數(shù)據(jù)做統(tǒng)計(jì),當(dāng)然,如果你是在做算法題,請(qǐng)不要使用它來取巧。
0x04:字典推導(dǎo)式
想要?jiǎng)?chuàng)建一個(gè)字典的子集,可以用字典推導(dǎo)式(dictionary comprehension)輕松搞定。沒錯(cuò),列表有列表生成式,字典也有字典推導(dǎo)式。
>>> students = {'a':98, 'b':45, 'c':73, 'd':59}
>>> passed = {key:value for key, value in students.items() if value >= 60}
>>> passed
{'a': 98, 'c': 73}
>>>
看,我們很輕松地通過記錄所有學(xué)生成績(jī)的字典獲得了及格學(xué)生的成績(jī)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
