2014-04-05 153 views
4

我有類型的字典列表如下:從字典列表中刪除具有重複值的字典。 Python的

[{'ppm_error': -5.441115144810845e-07, 'key': 'Y7', 'obs_ion': 1054.5045550349998}, 
{'ppm_error': 2.3119997582222951e-07, 'key': 'Y9', 'obs_ion': 1047.547178035}, 
{'ppm_error': 2.3119997582222951e-07, 'key': 'Y9', 'obs_ion': 1381.24928035}, 
{'ppm_error': -2.5532659838679713e-06, 'key': 'Y4', 'obs_ion': 741.339467035}, 
{'ppm_error': 1.3036219678359603e-05, 'key': 'Y10', 'obs_ion': 1349.712302035}, 
{'ppm_error': 3.4259216556970878e-06, 'key': 'Y6', 'obs_ion': 941.424286035}, 
{'ppm_error': 1.1292770047090912e-06, 'key': 'Y2', 'obs_ion': 261.156025035}, 
{'ppm_error': 1.1292770047090912e-06, 'key': 'Y2', 'obs_ion': 389.156424565}, 
{'ppm_error': 9.326980606898406e-06, 'key': 'Y5', 'obs_ion': 667.3107950350001} 
] 

我想重複鍵刪除類型的字典這樣,只有擁有獨特的「鑰匙」類型的字典仍然存在。哪個字典在最終名單中結束並不重要。因此,最終名單應該如下所示:

[{'ppm_error': -5.441115144810845e-07, 'key': 'Y7', 'obs_ion': 1054.5045550349998}, 
{'ppm_error': 2.3119997582222951e-07, 'key': 'Y9', 'obs_ion': 1381.24928035}, 
{'ppm_error': -2.5532659838679713e-06, 'key': 'Y4', 'obs_ion': 741.339467035}, 
{'ppm_error': 1.3036219678359603e-05, 'key': 'Y10', 'obs_ion': 1349.712302035}, 
{'ppm_error': 3.4259216556970878e-06, 'key': 'Y6', 'obs_ion': 941.424286035}, 
{'ppm_error': 1.1292770047090912e-06, 'key': 'Y2', 'obs_ion': 261.156025035}, 
{'ppm_error': 9.326980606898406e-06, 'key': 'Y5', 'obs_ion': 667.3107950350001} 
] 

是否有可能使用itertools.groupby功能這樣做還是有處理這個問題的另一種方式?有什麼建議麼?

+0

當你說'keys'時,你的意思是'key',對吧? – thefourtheye

+0

@thefourtheye:是的,我更新了這個帖子。感謝您指出。 – kkhatri99

+0

另外,輸出列表中的字典順序是否重要? – thefourtheye

回答

6

如果訂單的問題,那麼你可以使用collections.OrderedDict收集所有物品,像這樣

from collections import OrderedDict 
print OrderedDict((d["key"], d) for d in my_list).values() 

而且,如果順序並不重要,你可以使用普通的字典,這樣

print {d["key"]:d for d in my_list}.values() 
+0

最好的解決方案,因爲鑰匙具有擁有獨特鑰匙的神奇屬性:) – Tadeck

0

我會做這樣的:

list = [...] # your list 

finallist = dict(map(lambda x: (x['key'],x), list)).values() 

主要是因爲在相同的soluti在@thefourtheye提供了他的答案......

+0

您可以添加說明嗎?目前這個答案是不完整的。 – bjb568

0

其轉換爲numpy的陣列

a = numpy.array([(d["ppm_error"],d["key"],d["obs_ion"]) for d in my_dicts]) 
mask =numpy.unique(a[:,1],True)[1] 
uniques = a[mask] 

然後再返回到一個字典

unique_entries = map(dict,[zip(labels,row) for row in uniques]) 
2

另一種解決方案是要記住處理鍵和返回不同的結果如果鑰匙已經被看到。這可以使用記憶化來完成:

def get_key_watcher(): 
    keys_seen = set() 
    def key_not_seen(d): 
     key = d['key'] 
     if key in keys_seen: 
      return False # key is not new 
     else: 
      keys_seen.add(key) 
      return True # key seen for the first time 
    return key_not_seen 

然後,你可以使用這樣的:

>>> filtered_dicts = filter(get_key_watcher(), dicts) 
>>> filtered_dicts 
[{'ppm_error': -5.441115144810845e-07, 'obs_ion': 1054.5045550349998, 'key': 'Y7'}, 
{'ppm_error': 2.3119997582222951e-07, 'obs_ion': 1047.547178035, 'key': 'Y9'}, 
{'ppm_error': -2.5532659838679713e-06, 'obs_ion': 741.339467035, 'key': 'Y4'}, 
{'ppm_error': 1.3036219678359603e-05, 'obs_ion': 1349.712302035, 'key': 'Y10'}, 
{'ppm_error': 3.4259216556970878e-06, 'obs_ion': 941.424286035, 'key': 'Y6'}, 
{'ppm_error': 1.1292770047090912e-06, 'obs_ion': 261.156025035, 'key': 'Y2'}, 
{'ppm_error': 9.326980606898406e-06, 'obs_ion': 667.3107950350001, 'key': 'Y5'}] 

它保持字典順序,效果顯着。並保持字典遇到第一。

+1

真的很高雅,我正在摸索像'過濾器'這樣的搜索詞,這裏是我正在尋找的一個很好的例子。再提醒一下,python看起來非常像僞代碼,我猜是直覺的定義。 – Sacrilicious