2013-12-21 57 views
4

我正在嘗試創建一個可以附加到for循環中的列表的字典。但是,如果我使用fromkeys創建字典,則列表將成爲「指針」的副本,而不是新列表。例如,創建與列表不同的空白列表的字典

newdict = dict.fromkeys(range(10), [])

- 或 -

newdict = dict.fromkeys(range(10), list())

兩者產生相同的數據結構,具有相同的列表作爲值對的字典。所以,當任何密鑰更新時,例如 - newdict[0].append(100)print newdict相應的輸出是:

{0: [100], 1: [100], 2: [100], 3: [100], 4: [100], 5: [100], 6: [100], 7: [100], 8: [100], 9: [100]}

如何避免這種情況,而不必通過一個迭代的for循環有什麼想法?提前致謝。

+3

輕微:您的意思是'newdict [0] .append(100)',或'newdict [0] + = [100]',而不是'newdict [0] = 100'。 – DSM

+0

我沒有得到3.3.3的這種行爲:'newdict [0] = 100'產生'{0:100,1:[],2:[],3:[],4:[],5: [],6:[],7:[],8:[],9:[]}'... – MattDMo

+0

@DSM - 是的,謝謝我糾正錯誤。 – paulski

回答

5

兩種最常見的方法是使用字典理解:

>>> d = {k: [] for k in range(10)} 
>>> d[3].append(100) 
>>> d 
{0: [], 1: [], 2: [], 3: [100], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []} 

或者使用defaultdict和放棄設置任何按鍵都:

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> d 
defaultdict(<type 'list'>, {}) 
>>> d[9].append(100) 
>>> d 
defaultdict(<type 'list'>, {9: [100]}) 

作爲第三種選擇,通過使用setdefault - 例如d.setdefault(k, []),而不是d[k],像defaultdict情況下,你能避免需要預設[]

>>> d = {} 
>>> d.setdefault(3, []).append(100) 
>>> d 
{3: [100]} 
4

也許是詞典理解?

​​
+0

他不想使用for循環 – thefourtheye

+4

@thefourtheye我不確定我會考慮理解爲循環。 – Xymostech

+0

如果不需要在for循環中遍歷問題意味着什麼...... – thefourtheye

0

我想你想要做的

newdict[0].append(100) 

吧?

0

fromkeysdict類的靜態方法。默認行爲是設計一組字典鍵的設置爲值,如設置了多組計數器:

>>> d={}.fromkeys('abc',0) 
>>> d 
{'a': 0, 'c': 0, 'b': 0} 
>>> d['a']+=1 
>>> d 
{'a': 1, 'c': 0, 'b': 0} 

可以補丁它呼籲每個元素的功能:

>>> class FixFromKeys(dict): 
...  def fromkeys(cls, seq, func): 
...   return {key:func() for key in seq} 
... 
>>> d=FixFromKeys().fromkeys([1,2,3],list) 
>>> d[1].append(1) 
>>> d 
{1: [1], 2: [], 3: []}