在Python中,找出两个有序列表之间的差异数量
我想比较两个长度相同的列表在Python中,找出两个有序列表之间的差异数量,python,list,Python,List,我想比较两个长度相同的列表 a = [1, 3, 5, 7, 9] b = [1, 2, 5, 7, 3] 并找出差异数n,在这种情况下,它将是n=2,如果长度不相等,还将返回一个错误。pythonic的方法是什么?最简单的方法是使用和: 我们将列表循环使用,然后比较它们。由于True==1和False==0,我们只需将其相加即可得到差异数。另一个选项是使用生成器表达式的条件部分: sum(1 for i, j in zip(a, b) if i != j) 我不能说我觉得其中一个比另一个更
a = [1, 3, 5, 7, 9]
b = [1, 2, 5, 7, 3]
并找出差异数
n
,在这种情况下,它将是n=2
,如果长度不相等,还将返回一个错误。pythonic的方法是什么?最简单的方法是使用和:
我们将列表循环使用,然后比较它们。由于True==1
和False==0
,我们只需将其相加即可得到差异数。另一个选项是使用生成器表达式的条件部分:
sum(1 for i, j in zip(a, b) if i != j)
我不能说我觉得其中一个比另一个更具可读性,我怀疑会有性能上的差异。您可以使用。将这两个角色转换为一组,然后找出两者之间的差异。例如:
>>> a = [1,3,5,7,9]
>>> b = [1,2,5,7,2]
>>> len(set(a) - set(b))
2
这可以包含在一个函数中,首先检查长度差异。一个线性解决方案,如果长度不相等,也会产生错误:
>>> sum(map(lambda x,y: bool(x-y),a,b))
2
现在尝试不同长度的输入:
>>> sum(map(lambda x,y: bool(x-y),[1,2],[1]))
TypeError
工作原理:如果元素不同,bool(x,y)返回True。然后我们将此函数映射到两个列表上,并得到列表[False,True,False,True,False]。如果我们将不同长度的列表放入函数map()中,就会得到TypeError
最后,这个布尔列表的函数sum()给出了2。如果有重复的元素,这将不起作用,并且不考虑顺序<代码>差异([1,3,5,7,9],[9,7,5,3,1])将是
0
,而不是4
。OP的示例将3
视为不同,尽管它存在于两个列表中(即位置问题)。这也忽略了问题中提到的列表长度不同的可能性。啊,是的,我错过了最后3个,在我的示例中使用了2个。我的错!我提到,根据您的示例代码,可以使用函数来检查差异。我更喜欢显式的1 for I
,而不是隐式的布尔值(依赖于它是int
),但无论如何+1(只要它是显式的长度检查)@JonClements我同意,还有重要的部分(比较)被推到表达式的末尾,感觉很尴尬。我一直在改变我喜欢哪一种。请注意,map()
和lambda
通常比列表comp/generator表达式更慢,可读性也更低,这只适用于数字。是的,它们更慢,但代码要短得多,这取决于需要什么(夸张,需要速度,不要使用python:)).更具可读性的是一个非常主观的问题。您是对的,这在未定义“-”操作的类型上不起作用。谢谢您提供了另一个解决方案。我更喜欢@Lattyware的解决方案,因为我个人觉得它更具可读性。我不熟悉lambda
函数。还有他的解决方案,我可以定义错误消息,这样我就知道我得到了什么错误。
>>> sum(map(lambda x,y: bool(x-y),[1,2],[1]))
TypeError