我有两个清单:
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 ......为什么列表理解在一个案例中有效,但在另一个案例中却没有?
答案 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']