對於那些精通 「Are Your There」 的程序員,還有一個簡單的一樣也很惱人的行爲,不單單對於dict而言,它很廣泛git
若是你非要Not程序員
not key in dct
English,你會說麼?:github
key not in dct
這個是至關流行。你有一個dict和key,而且你想修改key對應的值,好比給它自增1(假如你在數數)。app
比較遜一點的作法::測試
if key not in dct: dct[key] = 0 dct[key] = dct[key] + 1
漂亮的作法:spa
dct[key] = dct.get(key, 0) + 1
關於 dct.get(key[, default]) ,若是 key 存在,返回 dct[key],不然返回defaultorm
更棒的作法是:htm
若是你在使用Python 2.7,你就能夠用Counter來計數了:
>>> from collections import Counter >>> d = [1, 1, 1, 2, 2, 3, 1, 1] >>> Counter(d) Counter({1: 5, 2: 2, 3: 1})
這裏還有些更完整的例子:
>>> counter = Counter() ... for _ in range(10): ... num = int(raw_input("Enter a number: ")) ... counter.update([num]) ... ... for key, value in counter.iteritems(): ... print "You have entered {}, {} times!".format(key, value) Enter a number: 1 Enter a number: 1 Enter a number: 2 Enter a number: 3 Enter a number: 51 Enter a number: 1 Enter a number: 1 Enter a number: 1 Enter a number: 2 Enter a number: 3 You have entered 1, 5 times! You have entered 2, 2 times! You have entered 3, 2 times! You have entered 51, 1 times!
有時你的字典裏都是常常修改的對象,你須要初始化一些數據到這個字典,也須要修改其中的一些值。好比說,你在維護一個這樣的dict:它的值都是鏈表。
寫一個實現就是:
dct = {} for (key, value) in data: if key in dct: dct[key].append(value) else: dct[key] = [value]
更Pythonic的作法是:
dct = {} for (key, value) in data: group = dct.setdefault(key, []) # key might exist already group.append(value)
setdefault(key, default) 所作的是:若是存在,返回 dct[key] , 不存在則把dct[key] 設爲 default 並返回它。當一個默認的值是一個你能夠修改的對象的時候這是頗有用的。
使用 defaultdict
dct = defaultdict(list) for (key, value) in data: dct[key].append(value) # all keys have a default already
defaultdict 很是棒, 它每生成一對新的 key-value ,就會給value一個默認值, 這個默認值就是 defaultdict 的參數。(注:defaultdict在模塊 collections 中)
一個頗有意思的就是,defaultdict實現的一行的tree:https://gist.github.com/2012250