2015-10-26 46 views
-1

我有這樣的詞典列表:在字典中刪除重複和列表值追加到一個關鍵

[{'name': 'comet1', 'coordinates': [15., 10.12345612]}, 
{'name': 'comet2', 'coordinates': [11.45678762, 12.56789876]}, 
{'name': 'comet3', 'coordinates': [13.31512314, 14.68123912]}, 
{'name': 'comet3', 'coordinates': [10.78876782, 11.23234321]}] 

我試圖刪除重複的名稱和相應的座標值追加到只有一個名字。所以列表可以是類似的東西

[{'name': 'comet1', 'coordinates': [15., 10.12345612]}, 
{'name': 'comet2', 'coordinates': [11.45678762, 12.56789876]}, 
{'name': 'comet3', 'coordinates': [13.31512314, 14.68123912, 10.78876782, 11.23234321]}] 

上述數據是從外部文件獲得,並重新構造成這種格式。在使用defaultdict和其他方法後,我不太確定如何實現這一點。

這是我嘗試(邏輯錯誤是在第二個for循環。)

content = [] 
comets = {"name":comet_name, "coordinates":coordinates} 
    content.append(comets) 
new_d = {} 
for x in content: 
    for name in names: #names is a set containing all indivual comet names 
     if x["name"] == name: 
      print(x["name"]) 
      new_d = {"name":name, "coordinates": x["coordinates"].append(coordinates) 
+2

歡迎!通常情況下,如果您向我們展示解決問題的嘗試,那麼我們可以幫助您對它們進行微調,而不僅僅是要求我們爲您提供解決方案。 StackOverflow不是代碼寫入服務。 –

+1

你最終可能不希望這樣做,因爲從'[1,2,3,4,5,6]'提取有用的座標將比'[[1,2],[3,4]]更惱人, [5,6]]。你也應該使用元組來代替列表。 –

+1

你真的想要保持清單的結構?合作真的很糟糕。使用從名稱到座標的單個字典映射會容易得多。事實上,我能想到的唯一有效方法就是先創建單個字典,然後用它來重建列表中的字典。 – Blckknght

回答

1

我可能會使用一個defaultdict收集座標。沿着這些方向的東西:

from collections import defaultdict 

result = defaultdict(list) 

for comet in initiallist: 
    result[comet['name']].extend(comet['coordinates']) 
    # Or for a list of tuples 
    result[comet['name']].append(tuple(comet['coordinates'])) 

這應該會產生你後面的結果(就像我可以告訴的那樣)。

+1

按照Alex Hall的建議,你也可以對座標對進行元組化。 – pcurry

+0

同意,但只限於用戶需要元組。他所要求的結果明顯變平了,所以我就這樣做了,但我還會添加其他選項。 –

0

我打算假設您有足夠的這些來處理通過源列表中的單個傳遞更可取。另外,你還想要字典列表。

from collections import defaultdict 


final_list = [] 
lookup_map = defaultdict(lambda : -1) 
for comet in sighting_list: 
    final_index = lookup_map[comet["name"]] 
    if final_index < 0: 
     lookup_map[comet["name"]] = len(final_list) 
     final_list.append(comet) 
    else: 
     final_list[final_index]["coordinates"].extend(comet["coordinates"]) 

這應該給你在你的comet_list中的每個彗星名稱的平面列表。

相關問題