2017-10-10 57 views
-1

任何人都可以請幫我用下面的代碼:我怎樣才能插入指向多個詞典列表內的字典

[{k: {x: y for x, y in b.items()} for b in arg for k in range(len(arg))}] 

其中arg是:

arg = [{"key1": "val1", "key2": "val2"}, {"key1": "val3", "key2": "val4"}] 

進出口尋找的輸出是:

[0: {"key1": "val1", "key2": "val2"}, 1: {"key1": "val3", "key2": "val4"}] 

當我運行上面的字典理解,我拿到

[0: {"key1": "val3", "key2": "val4"}, 1: {"key1": "val3", "key2": "val4"}] 

爲什麼第二個字典也指向0:點重複?我怎樣才能阻止這種情況發生,並且嵌套的字典都具有獨立的價值。這兩個鍵在嵌套的字典中都是相同的,但值必須不同。

+0

你有'k'和'​​b'上的雙循環。相反,你需要一個單一的循環'for k,b in enumerate(arg)'。 –

+1

你正在尋找的輸出不是一個有效的Python對象,雖然...並且你在'arg'中有一個拼寫錯誤(逗號需要分號) –

+0

恕我直言,你的邏輯太複雜,無法理解。它不再可讀,並且:「可讀性計數」。 - Python的禪 –

回答

1

你太過複雜了。只需使用enumerate() function,它產生的鍵值對開箱的:

dict(enumerate(arg)) 

dict()需要鍵值對的迭代:

>>> arg = [{"key1": "val1", "key2": "val2"}, {"key1": "val3", "key2": "val4"}] 
>>> dict(enumerate(arg)) 
{0: {'key1': 'val1', 'key2': 'val2'}, 1: {'key1': 'val3', 'key2': 'val4'}} 

arg字典不會被複制;如果這是一個問題,你可以使用一個map()dict.copy

dict(enumerate(map(dict.copy, arg))) 

,或者使用一個單一的字典解析:

{i: a.copy() for i, a in enumerate(arg)} 

你的代碼中創建一個雙循環;你基本上是這樣做的:

_dictionary = {} 
for b in arg: 
    for k in range(len(arg)): 
     _dictionary[k] = {x: y for x, y in b.items()} 
result = [_dictionary] 

所以在arg每個字典創建另一循環和重複創建一個字典bk的最後一個這樣的字典將贏得,並且由於arg中的最後一個字典被分配給01,它取代了arg中的任何其他字典(其中每個字典也分配給之前的所有整數鍵)。

您也不需要使用{x: y for x, y in b.items()},只需要b.copy()就足夠了。我也不確定你爲什麼把最終結果放入列表中。

+0

謝謝你解釋得那麼好。我沒有想過枚舉函數。再次感謝! – KabirGandhiok

0

您想要的輸出的小問題。你想要一個Dictionary而你

輸出林尋找的是:

[0:{ 「KEY1」: 「VAL1」, 「KEY2」: 「值2」},1:{ 「KEY1」 :「val3」,「key2」: 「val4」}]

list。所以,有效輸出應該是:

{0:{'key1':'val1','key2':'val2'},1:{'key1':'val3','key2':

{ i:l[i] for i in range(len(l)) } 

# OR 

{ i:key for i,key in enumerate(l) } 

#driver值

IN : l = [{"key1":"val1", "key2":"val2"}, {"key1":"val3", "key2":"val4"}] 
OUT : {0: {'key1': 'val1', 'key2': 'val2'}, 1: {'key1': 'val3', 'key2': 'val4'}} 

編輯::Martijn Pieters提供SH 'VAL4'}}

與獲取此使用enumerate的方法。檢查出來。

0

如果我已經正確解釋了這個問題,你需要一本字典詞典。這將做到這一點:

{index: val.copy() for index, val in enumerate(arg)} 

其中arg是您的預定義字典。

編輯:用戶Martijn Pieters上面提到的是一個乾淨的方式!

0

你的代碼相當複雜。如何: [{k: arg[k]} for k in range(len(arg))]

相關問題