Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,找出两个有序列表之间的差异数量_Python_List - Fatal编程技术网

在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