2016-09-15 46 views
0

我有我需要創建嵌入到一個列表對象重複鍵,這樣的字典對象的要求:蟒蛇創建詞典的列表,而無需參考

[{ "key": "ABC" },{ "key": "EFG" } ] 

我決定初始化一個頂級名單空像outer_list=[]和佔位符字典對象如dict_obj= {}。接下來,我連續使用下列步驟將元素添加到我的列表:

  1. 分配{ "key": "ABC" }使用dict_obj["key"]="ABC"
  2. 這個對象添加到使用outer_list.append(dict_obj)
  3. 刷新列表以dict_obj//在字典對象的項目使用彈出鍵dict_obj.clear()
  4. 重複步驟基於鍵/項目組合的在我的數據

發行數1至3:噸他outer_list對象保留對原始dict_obj的引用,並且如果dict_obj被刷新或添加了新的密鑰/項目,則它會相應地改變。所以最後,我結束了這個[{ "key": "EFG" },{ "key": "EFG" } ]而不是[{ "key": "ABC" },{ "key": "EFG" } ]

請指導我一些解決方法,如果可能的話。

回答

1

我認爲有兩種方法可以避免重複引用。

第一個是append字典的副本,而不是對它的引用。 dict實例有一個copy方法,所以這很容易。只要改變你目前的append呼籲:

outer_list.append(dict_obj.copy())` 

另一種選擇是不總是使用相同的dict_obj對象,而是爲每個條目的單獨的字典對象。在這個版本中,你會更換您的來電dict_obj.clear()有:

dict_obj = {} 

對於第二種方法,你可能會選擇重新排序的事情,而不是做一個筆直的線更換。您可以將設置代碼移動到循環的開始位置,並在循環結束時清除重置邏輯。

也就是說,看起來像這樣,更改代碼:

outer_list = [] 
dict_obj = {} 
for foo in whatever: 
    # add stuff to dict_obj 
    outer_list.append(dict_obj) 
    dict_obj.clear() 

要:

outer_list = [] 
for foo in whatever: 
    dict_obj = {} 
    # add stuff to dict_obj 
    outer_list.append(dict_obj) 

如果創建內部字典的邏輯是很簡單的計算,你甚至可以把整個東西變成列表理解:

outer_list = [{"key": value, "key2": value2} for value, value2 in some_sequence] 
+0

謝謝@Blckknght您指出的第一個選項適用於我。我需要在列表中累積鍵值,直到滿足某個條件,然後在完成後重置它(並進行下一次迭代)。我在清除列表內容的順序方面遇到了一些問題,但主要與數據有關。我也意識到,如果我的密鑰是相同的,我甚至不需要重置我的字典對象dict_obj,因爲同一個id的密鑰值將被覆蓋。 –

0

以下內容應該不言自明:

# object reuse 
d = {} 
l = [] 
d['key'] = 'ABC' 
l.append(d) 
d.clear() 
print(l) # [{}] : cleared! 
d['key'] = 'EFG' 
l.append(d) 
print(l) # [{'key': 'EFG'}, {'key': 'EFG'}] 


# explicit creation of new objects 
d = {} 
l = [] 
d['key'] = 'ABC' 
l.append(d) 
print(l) 
d = {} 
d['key'] = 'EFG' 
l.append(d) 
print(l)