我有一個日期名稱列表(通常是星期一至星期六,但特殊情況適用),我想創建一個字典。我想將每天的價值初始化爲零。從單個列表中構建詞典的最常用Python方法
如果我有零列表工作日列表的長度相同,這將是一個zip()
簡單的用例。然而,零名單是浪費空間,如果這是唯一的解決方案,我倒寧願做這樣的事情:
for day in weekList:
dayDict[day] = 0
有沒有更Python的方式?
我有一個日期名稱列表(通常是星期一至星期六,但特殊情況適用),我想創建一個字典。我想將每天的價值初始化爲零。從單個列表中構建詞典的最常用Python方法
如果我有零列表工作日列表的長度相同,這將是一個zip()
簡單的用例。然而,零名單是浪費空間,如果這是唯一的解決方案,我倒寧願做這樣的事情:
for day in weekList:
dayDict[day] = 0
有沒有更Python的方式?
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
dayDict = dict.fromkeys(weekList, 0)
它建立使用從第一參數(序列)作爲鍵的元素的字典,並且所述第二參數(缺省爲None
),爲所有條目的值。
由於非常自然,此方法將重用所有鍵的值;不要將它傳遞給一個可變值,如列表或字典,並期望它爲每個鍵創建可變值的單獨副本。在這種情況下,使用字典的理解,而不是:
dayDict = {d: [] for d in weekList}
您可能還需要尋找到一個'collections.defaultdict(int)' - 這會做基本相同的事情,但如果您嘗試獲取不存在的密鑰,則不會得到「KeyError」。 – mgilson