Python - 在一个推导式中比较两个列表

7
我想理解推导式的工作原理。
我想循环遍历两个列表,并比较它们以找到差异。如果有一个或多个单词不同,我想打印出这些单词。
我希望所有代码都在一行中完成,这就是为什么我对推导式感兴趣的原因。
3个回答

21

用“一行代码”来完成这个任务只是为了玩代码高尔夫,而且是错误的。相反,应该让代码易读。

for a, b in zip(list1, list2):
    if a != b:
       print(a, "is different from", b) 

这并没有任何重大的不同之处:

[print(a, "is different from", b) for a, b in zip(list1, list2) if a!=b]

扩展版比推导式更易于阅读和理解。


我同意,这种方式更易读,但我已经用了一段时间,感到有些无聊了...不过 zip 方法还是很好的,谢谢你向我展示。如果有更短的方法...我也可以学习一下...说不定会派上用场。 - Rhys
3
没有更短的方法来进行这个比较。其他的解决方案对“差异”的理解有所不同。哪种方法是正确的取决于您。因为写好代码感到无聊可能不是一个好的理由。;) (注意:原文中的表情符号是笑脸加分号,表示调侃) - Lennart Regebro
1
作为这周学习Python的人,我很欣赏你的答案和代码的清晰度。做得好! - Danny
如果两个列表的大小相同,则此方法有效。如果列表a比列表b大很多怎么办? - Naga Vemprala
1
第二个代码片段有很大的不同,因为它构建了一个无意义的列表,其中包含由print调用返回的None值-这是不符合Python风格的,列表推导式用于构建列表而不是过程调用。 - Chris_Rands

16

像kriegar建议的那样,使用集合可能是最简单的解决方案。如果你绝对需要使用列表推导式,我会这样做:

list_1 = [1, 2, 3, 4, 5, 6]
list_2 = [1, 2, 3, 0, 5, 6]

# Print all items from list_1 that are not in list_2 ()
print(*[item for item in list_1 if item not in list_2], sep='\n')

# Print all items from list_1 that differ from the item at the same index in list_2
print(*[x for x, y in zip(list_1, list_2) if x != y], sep='\n')

# Print all items from list_2 that differ from the item at the same index in list_1
print(*[y for x, y in zip(list_1, list_2) if x != y], sep='\n')

5
如果您想比较两个列表的差异,我认为您需要使用一个set
s.symmetric_difference(t)   s ^ t   new set with elements in either s or t but not both

例子:
>>> L1 = ['a', 'b', 'c', 'd']
>>> L2 = ['b', 'c', 'd', 'e'] 
>>> S1 = set(L1)
>>> S2 = set(L2)
>>> difference = list(S1.symmetric_difference(S2))
>>> print difference
['a', 'e']
>>> 

一行表单?

>>> print list(set(L1).symmetric_difference(set(L2)))
['a', 'e']
>>> 

如果你真的想使用列表推导式:

>>> [word for word in L1 if word not in L2] + [word for word in L2 if word not in L1]
['a', 'e']

随着列表大小的增长,效率会大大降低。


这是一个很好的建议,我一定会使用它。但在我探索更多关于推导式的知识时,我必须支持überjesus...除非我可以给出多个支持,但我还没有尝试过。 - Rhys
我的理解是元素可以重复,而且顺序很重要。这样使用 set 就不能产生正确的结果。 - pepr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接