2015-12-14 137 views
2

我是python的新手,我遇到以下問題需要解決。過濾python重複列表

我有一個詞典列表,其中重複name的值,例如:reel1

我需要追加到一個新的列表具有獨特的名字的字典,對於我使用的最大version數量,取消這種情況下,這將是reel1版本10

store = [ 
    {'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '09', 'name': 'reel1'}, 
    {'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '10', 'name': 'reel1'}, 
    {'url': 'n0:project:film:reel2_c09', 'range': None, 'version': '09', 'name': 'reel2'} 
] 

的結果應該是喜歡這個。

result = [ 
    {'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '10', 'name': 'reel1'}, 
    {'url': 'n0:project:film:reel2_c09', 'range': None, 'version': '09', 'name': 'reel2'} 
] 

非常感謝您的幫助。

+1

張貼您的企圖。 –

+1

有一個叫['set']的東西(https://docs.python.org/2/library/stdtypes.html#set)。瞭解它。我確定這就是你想要的。 –

+2

可能的重複[在Python中刪除重複的字典列表](http://stackoverflow.com/questions/9427163/remove-duplicate-dict-in-list-in-python) – eph

回答

4

這樣做:

store = [ 
    {'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '09', 'name': 'reel1'}, 
    {'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '10', 'name': 'reel1'}, 
    {'url': 'n0:project:film:reel2_c09', 'range': None, 'version': '09', 'name': 'reel2'} 
] 

l = [reduce(lambda x, y: x if int(x['version']) > int(y['version']) else y, filter(lambda e: e['url'] == n, store)) for n in {d['url'] for d in store}] 
print l 

[{'url': 'n0:project:film:reel2_c09', 'range': None, 'version': '09', 'name': 'reel2'}, {'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '10', 'name': 'reel1'}] 

解釋代碼: 設置url併爲他們中的每一個過濾店名單採取重複和接受一個減少子列表中的最大版本。 擴大的部分:

以獨特的URL值在商店列表:

{d['url'] for d in store} 

收集所有duplicades共同它們上市:

filter(lambda e: e['url'] == n, store)) 

減少與重複每個子表,並採取了一個與更高的版本:

reduce(lambda x, y: x if int(x['version']) > int(y['version']) else y 
+0

我有一個語法錯誤for循環'{d ['url'] for d in store}'我不明白爲什麼。我使用python 2.6.2 –

+0

@FilmmoreBrussels使用'set([d ['url'] for d in store])'而不是檢查 – Netwave

+0

非常感謝你! –