2013-01-10 9 views
8

我有一個日期名稱列表(通常是星期一至星期六,但特殊情況適用),我想創建一個字典。我想將每天的價值初始化爲零。從單個列表中構建詞典的最常用Python方法

如果我有零列表工作日列表的長度相同,這將是一個zip()簡單的用例。然而,零名單是浪費空間,如果這是唯一的解決方案,我倒寧願做這樣的事情:

for day in weekList: 
    dayDict[day] = 0 

有沒有更Python的方式?

+4

您可能還需要尋找到一個'collections.defaultdict(int)' - 這會做基本相同的事情,但如果您嘗試獲取不存在的密鑰,則不會得到「KeyError」。 – mgilson

回答

17
dict.fromkeys

除此之外,你還可以使用dict-comprehension, 但fromkeys()比字典內涵快:

對於2.6和更早的版本:

In [30]: dic = dict((x, 0) for x in lis) 

In [31]: dic 
Out[31]: {'a': 0, 'b': 0, 'c': 0, 'd': 0} 

timeit比較:

In [38]: %timeit dict.fromkeys(xrange(10000), 0)   # winner 
1000 loops, best of 3: 1.4 ms per loop 

In [39]: %timeit {x: 0 for x in xrange(10000)} 
100 loops, best of 3: 2.08 ms per loop 

In [40]: %timeit dict((x, 0) for x in xrange(10000)) 
100 loops, best of 3: 4.63 ms per loop 

正如@Eumiro和@mgilson需要注意的是fromkeys()dict-comprehensions可能返回不同的對象,如果使用的值是可變對象是很重要的在評論中提到:

In [42]: dic = dict.fromkeys(lis, []) 

In [43]: [id(x) for x in dic.values()] 
Out[43]: [165420716, 165420716, 165420716, 165420716] # all point to a same object 

In [44]: dic = {x: [] for x in lis} 

In [45]: [id(x) for x in dic.values()] 
Out[45]: [165420780, 165420940, 163062700, 163948812] # unique objects 
+3

請注意'.fromkeys()'要快得多。 –

+1

雖然你可以使用默認值的字典理解爲一個列表或其他任何東西,'.fromkeys()'可用於不可變對象只(無,布爾,整數,浮點數,字符串和元組) – eumiro

+1

@eumiro - 可你詳細說明這個評論? 'dict.fromkeys(range(10),[])'工作正常(當然,如果你正在談論的話,你將多個引用存儲在同一個列表中),但這可能是可以的,甚至是可取的在某些情況下。 – mgilson

25

使用.fromkeys() class method

dayDict = dict.fromkeys(weekList, 0) 

它建立使用從第一參數(序列)作爲鍵的元素的字典,並且所述第二參數(缺省爲None),爲所有條目的值。

由於非常自然,此方法將重用所有鍵的值;不要將它傳遞給一個可變值,如列表或字典,並期望它爲每個鍵創建可變值的單獨副本。在這種情況下,使用字典的理解,而不是:

dayDict = {d: [] for d in weekList} 
相關問題