作為最常用的數(shù)據(jù)結(jié)構(gòu),但是我一直都覺(jué)得自己是個(gè)lowbi,歷史如下:
V1
實(shí)現(xiàn)一個(gè)list計(jì)數(shù)的功能,我以前經(jīng)常這么寫(xiě)
foo_dict = {}
for i in a_list:
if i in foo_dict:
foo_dict[i] += 1
else:
foo_dict[i] =1
V2
現(xiàn)在看來(lái)簡(jiǎn)直low逼了
稍微改進(jìn)一點(diǎn)的話實(shí)際上應(yīng)該這么用:
foo_dict = {}
for i in a_list:
foo_dict.set_default(i,0)
foo_dict[i] += 1
這樣代碼的復(fù)雜度就降了一個(gè)
ps
set_default可以認(rèn)為是get的反操作.
另外擴(kuò)展下:在linux shell當(dāng)中的get方法: new=$(test:-another),當(dāng)test有值的時(shí)候取前者,否則取后者.
v3
但現(xiàn)在看來(lái),明顯有更好的方法,直接調(diào)用collection的default_dict
func = lambda x: 0
d = default_dict(func)
for i in a_list:
d[i] += 1
這樣做的好處是:
"This technique is simpler and faster than an equivalent technique using dict.setdefault()
:" ---from python文檔
v4
那這樣是不是最簡(jiǎn)潔的呢,不,
C = Counter(a_list)
一步到位
為毛還要你一直造輪子呢!
Ps:當(dāng)你冥思苦想一直都找不出bug的時(shí)候,當(dāng)你覺(jué)得自己實(shí)現(xiàn)了一個(gè)功能特別牛逼的時(shí)候,一定要沉下心來(lái),默默念三遍
我就是個(gè)傻逼
我就是個(gè)傻逼
我就是個(gè)傻逼
然后,你會(huì)覺(jué)得,
你真的是個(gè)傻逼。
這個(gè)方法我已經(jīng)用了幾年了,屢試不爽……
============================我是分割線==========================================
v1
實(shí)現(xiàn)一個(gè)字典,這個(gè)字典是另外兩個(gè)字典的并集,
以前的我是肯定是先copy,然后再u(mài)pdate,
但是好像不太直觀,可讀性要差一點(diǎn)
V2
.items()加起來(lái),然后dict一下
dict(a.iteriterms()+b.iteriterms())
v3
上面的方法會(huì)在py3中報(bào)錯(cuò),
所以為什么不試試
Z = {星號(hào)x,星號(hào)y}
呢
一步到位,而且pythonic
當(dāng)然,也可以用字典推倒式
但是我是一直不推薦用字典推倒式的,因?yàn)樾侍恍舤imeit一下