[英]Finding unique items in list and add them to new list with list comprehension
给定myList1
myList1 = [5,3,7,2,88,42,2,4,3,7,2]
我想将myList1
所有项目添加到myList2
但每个唯一项目仅添加一次。 所以我期望这样的列表:
[5, 3, 7, 2, 88, 42, 4]
我想通过列表理解来做到这一点。 我尝试了这个,但它又给了我与myList1
相同的项目
myList2 = []
myList2 = [item for item in myList1 if item not in myList2]
我究竟做错了什么?
首先假设您关心维护顺序:如果我使用list-comp,这就是我倾向于这样做的方式:
seen = set()
myList2 = [x for x in myList1 if x not in seen and not seen.add(x)]
或交替
from collections import OrderedDict
myList2 = list(OrderedDict.fromkeys(myList1))
这两种方法均为O(n)。 您在执行此操作时必须小心,不要对list
进行重复的成员资格测试(或index
搜索),以使算法成为O(n ** 2)。
如果您不关心订单,那么您实际上只想做:
mySet = set(myList1)
之所以看到列表中的所有元素,是因为myList2
仅在理解完成后才设置为新列表(由理解创建)。 这意味着在列表理解中,它总是将myList2
视为一个空列表,因此每个项目都不在列表中,因此将其放入新列表中。
如果使用set
则可以非常轻松地完成该任务。
myList1 = [5,3,7,2,88,42,2,4,3,7,2]
s = list(set(myList1))
print s
如果您确实要使用列表推导,并且不想使用建议的set
:
[myList1[i] for i in range(len(myList1)) if not myList1[i] in myList1[:i]]
关于如何正确执行的许多好的建议。 简要说明为什么您的代码不起作用的原因可能对您有所帮助。 在myList2 = [item for item in myList1 if item not in myList2]
, if item not in myList2
myList2 = [item for item in myList1 if item not in myList2]
, if item not in myList2
中,则当myList2
为空时,将在循环开始时myList2
进行一次评估。 在下面的示例中, if item not in myList2
将出现在每个循环中,在此循环中还将新值附加到myList2
:
>>> myList1 = [5,3,7,2,88,42,2,4,3,7,2]
>>> myList2 = []
>>> for item in myList1:
if item not in myList2:
myList2.append(item)
>>> myList2
[5, 3, 7, 2, 88, 42, 4]
我们得到了预期的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.