繁体   English   中英

在列表中查找唯一项并将其添加到具有列表理解的新列表中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM