有没有一种很好的方法可以通过属性从列表中删除元素?
示例:
lis = [['element1', 12], ['element2', 2], ['element3', 12], ['element4', 36], ['element5', 12]]
我希望得到这份清单:
new_lis = [['element1', 12], ['element2', 2], ['element4', 36]]
我正在寻找一个简短而优雅的解决方案,也许是一个我不熟悉的模块?
答案 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]]