在python中删除其属性的重复元素

时间:2016-01-06 10:26:04

标签: python list duplicates

有没有一种很好的方法可以通过属性从列表中删除元素?

示例:

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

我希望得到这份清单:

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

我正在寻找一个简短而优雅的解决方案,也许是一个我不熟悉的模块?

2 个答案:

答案 0 :(得分:4)

执行此操作的最佳方法是使用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 :(得分: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]]