1.字典鍵-值對(duì)中,值元素的便捷創(chuàng)建增減
主要是利用collections 中的defaultdict
普通復(fù)雜過(guò)程:
pairs = [('a', 1), ('a', 2),('b', 2)]
d = {}
for key, value in pairs:
if key not in d:
d[key] = []
d[key].append(value)
或
d = {} #普通字典
d.setdefault('a', []).append(1)
d.setdefault('a', []).append(2)
d.setdefault('b', []).append(4)
當(dāng)我們使用普通的字典時(shí),還可以dict={},添加元素的只需要dict[element] =value,調(diào)用的時(shí)候也是如此,dict[element] = xxx,但前提是element在字典里,如果不在字典里就會(huì)報(bào)錯(cuò)
利用defaultdict就沒(méi)這些問(wèn)題,且精簡(jiǎn):
defaultdict接受一個(gè)工廠函數(shù)作為參數(shù),如下來(lái)構(gòu)造:
dict =defaultdict( factory_function)
這個(gè)factory_function可以是list、set、str等,有兩個(gè)作用,第一是當(dāng)key不存在時(shí),返回的是工廠函數(shù)的默認(rèn)值,比如list對(duì)應(yīng)[ ],str對(duì)應(yīng)的是空字符串,set對(duì)應(yīng)set( ),int對(duì)應(yīng)0,第二是可以對(duì)值做操作是調(diào)用相應(yīng)類(lèi)的函數(shù)
from collections import defaultdict
d = defaultdict(list)
for key, value in pairs:
d[key].append(value)
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)
d = defaultdict(set)
d['a'].add(1)
d['a'].add(2)
d['b'].add(4)
2.創(chuàng)建帶順序的字典
from collections import OrderedDict
d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# 輸出 "foo 1", "bar 2", "spam 3", "grok 4"
for key in d:
print(key, d[key])
若后續(xù)修改已插入的鍵值,不改變字典的順序。順序字典的內(nèi)存開(kāi)銷(xiāo)是比較大的,若數(shù)據(jù)量很大(比如100,000條以上),則考慮使用其他結(jié)構(gòu)保存數(shù)據(jù)。
?順序字典的一個(gè)應(yīng)用實(shí)例,json串構(gòu)造:
>>> import json
>>> json.dumps(d)
'{"foo": 1, "bar": 2, "spam": 3, "grok": 4}'
?
3.字典排序相關(guān)
prices = {
'ACME': 45.23,
'AAPL': 612.78,
'IBM': 205.55,
'HPQ': 37.20,
'FB': 10.75
}
# 通常:
min(prices) # Returns 'AAPL'
max(prices) # Returns 'IBM'
min(prices.values()) # Returns 10.75
max(prices.values()) # Returns 612.78
# 高級(jí)一點(diǎn):
min(prices, key=lambda k: prices[k]) # Returns 'FB'
max(prices, key=lambda k: prices[k]) # Returns 'AAPL'
min_value = prices[min(prices, key=lambda k: prices[k])]
sorted(prices, key=lambda k: prices[k])# Returns ['FB', 'HPQ', 'ACME', 'IBM', 'AAPL']
# 以上都要想獲取較全的鍵值信息都比較繁瑣,可轉(zhuǎn)化成(值,鍵)進(jìn)行排序
min_price = min(zip(prices.values(), prices.keys()))
# min_price is (10.75, 'FB')
max_price = max(zip(prices.values(), prices.keys()))
# max_price is (612.78, 'AAPL')
prices_sorted = sorted(zip(prices.values(), prices.keys()))
# prices_sorted is [(10.75, 'FB'), (37.2, 'HPQ'),
# (45.23, 'ACME'), (205.55, 'IBM'),
# (612.78, 'AAPL')]
注意zip生成一個(gè)迭代器,只能用一次
另外:也可將字典轉(zhuǎn)為list:li=list(prices.items()),用【Python練習(xí)冊(cè)】heapq的應(yīng)用 的方法來(lái)排序
?
4.兩個(gè)字典間找異同
dict.keys()和dict.items分別為dict_keys和dict_items對(duì)象,具體叫做keys-view和items-view對(duì)象,之所以叫view是因?yàn)椋S著dict的變化,這些view也自動(dòng)改變。keys-view和items-view對(duì)象支持常規(guī)set操作,如求交集、并集、差集等。
a = {
'x': 1,
'y': 2,
'z': 3
}
b = {
'w': 10,
'x': 11,
'y': 2
}
# 找相同鍵
a.keys() & b.keys() # { 'x', 'y' }
# 找在a中不在b中的鍵
a.keys() - b.keys() # { 'z' }
# 找相同元素
a.items() & b.items() # { ('y', 2) }
# 移除特定鍵構(gòu)建新字典
c = {key: a[key] for key in a.keys() - {'z', 'w'}}
# c is {'x': 1, 'y': 2}
注意:dict.values是values-view對(duì)象,但不支持常規(guī)set操作,因?yàn)関alue值可以不唯一
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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