为什么这个列表理解仅适用于一个列表?

时间:2014-10-31 15:44:41

标签: python list-comprehension

我有两个清单:

list1 = ["a","b","c","d"]
list2 = ["e","f","g","a"]

我想确保他们没有任何共同点。如果他们这样做,我想从两个列表中删除这些元素。所以在这个例子中," a"应从两个列表中删除。

我尝试使用列表推导:

list1 = [x for x in list1 if x not in list2]
list2 = [x for x in list2 if x not in list1]

打印列表将返回以下内容:

list1: ['b', 'c', 'd']
list2: ['e', 'f', 'g', 'a']

所以它适用于list1,但不适用于list2 ......为什么列表理解在一个案例中有效,但在另一个案例中却没有?

4 个答案:

答案 0 :(得分:3)

请注意,如果您不需要列表,set在这里真的很不错。

>>> list1 = ["a","b","c","d"]
>>> list2 = ["e","f","g","a"]
>>> s1 = set(list1)
>>> s2 = set(list2)
>>> s1 - s2
set(['c', 'b', 'd'])
>>> s2 - s1
set(['e', 'g', 'f'])

随着输入增长的大小,这将更有效。请注意,您仍然需要一个临时的,因为您希望s2原始 s1之间存在差异:

temps1 = s1 - s2
s2 = s2 - s1
s1 = temps1

(或者,正如Alex指出的那样,你可以使用多个作业)

s1, s2 = s1 - s2, s2 - s1

答案 1 :(得分:2)

因为list1在第一行之后重新定义了不同的元素:

list1 = [x for x in list1 if x not in list2]
# ['b', 'c', 'd'] Different result, working with this now.

只需在一行就地修复它:

list1, list2 = [x for x in list1 if x not in list2], [x for x in list2 if x not in list1]

答案 2 :(得分:0)

您正在用第一个列表推导的结果替换list1([“b”,“c”,“d”]),因此当评估第二个列表推导时,“a”不再在list1中。

答案 3 :(得分:0)

当涉及第二个列表时,它将使用过滤的list1 进行检查。届时 将不会出现在中list1 ,因此它会在 list2 中打印 a 。您可以使用以下代码:

 list1 = ["a","b","c","d"]
 list2 = ["e","f","g","a"]
 list3=[]
 list4=[]
 for x in list1:
    if x not in list2:
       list3.append(x)
 for x in list2:
    if x not in list1:
       list4.append(x)

打印清单3 print list4

输出:

   ['b', 'c', 'd']
   ['e', 'f', 'g']