2016-01-06 39 views
3

有沒有一種很好的方式從列表中刪除元素,通過它們的屬性?在Python中刪除重複元素的屬性

例子:

lis = [['element1', 12], ['element2', 2], ['element3', 12], ['element4', 36], ['element5', 12]] 

而且我想這個名單:

new_lis = [['element1', 12], ['element2', 2], ['element4', 36]] 

我要尋找一個短期和優雅的解決方案,也許一個模塊,我不熟悉?

+0

? – sobolevn

+2

什麼決定你想在你的例子中保留'element1'還是'element3'? – poke

+1

[您如何從Python列表中刪除重複項,同時保持順序?](http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in -python-while-preserving-order) –

回答

2

寫出這樣的功能:

def remove_duplicates_n(lis, n): 
    'returns new list with items from lis and duplicates at position n removed, keeps order' 
    seen = set() 
    result = [] 
    for item in lis: 
     if item[n] not in seen: 
      result.append(item) 
      seen.add(item[n]) 
    return result 

您想要的結果,請致電remove_duplicates_n(lis, 1)

獎勵:如果你想去副作用的陰暗面......

>>> seen = set() 
>>> [x for x in lis if x[1] not in seen and not seen.add(x[1])] 
[['element1', 12], ['element2', 2], ['element4', 36]] 
3

要做到這一點,最好的辦法是使用simple generator功能。原因是generator是懶惰評估,這意味着它在需求列表中產生項目;爲大型列表節省大量內存。然後,您可以重複生成器對象和做一些與項目

演示:

>>> lis = [['element1', 12], ['element2', 2], ['element3', 12], ['element4', 36], ['element5', 12]] 
>>> def deduplicate(items): 
...  seen = set() 
...  for item in items: 
...   if not item[1] in seen: 
...    seen.add(item[1]) 
...    yield item 
... 
>>> deduplicate(lis) 
<generator object deduplicate at 0x7fd454352e08> 
>>> for item in deduplicate(lis): 
...  print(item) 
... 
['element1', 12] 
['element2', 2] 
['element4', 36] 
>>> list(deduplicate(lis)) 
[['element1', 12], ['element2', 2], ['element4', 36]] 
要按`[1]`項目從主列表中刪除重複
+0

爲什麼OP需要列表時生成器的最佳方式是?誠實的問題。 – timgeb