在Python中计算两个有序列表之间的差异数量

12 投票
3 回答
9494 浏览
提问于 2025-04-17 16:07

我想比较两个长度相同的列表

a = [1, 3, 5, 7, 9]
b = [1, 2, 5, 7, 3]

并找出它们之间的不同之处,记作n,在这个例子中n = 2,如果两个列表的长度不一样,还要返回一个错误。用Python怎么做比较好呢?

3 个回答

-2

你可以使用集合。先把两个东西都转换成集合,然后找出它们之间的差异。例如:

>>> a = [1,3,5,7,9]
>>> b = [1,2,5,7,2]
>>> len(set(a) -  set(b))
2

这可以放在一个函数里,先检查长度的差异。

1

这是一个一行代码的解决方案,如果长度不相等还会报错:

>>> 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)。

最后,boolean列表的sum()函数会返回2。

21

最简单的方法就是用 内置的 sum() 函数 和一个 生成器表达式

def differences(a, b):
    if len(a) != len(b):
        raise ValueError("Lists of different length.")
    return sum(i != j for i, j in zip(a, b))

我们可以用 zip() 函数把两个列表一起循环,然后进行比较。因为 True == 1False == 0,所以我们只需要把这些结果相加,就能得到不同的数量。另一种选择是使用生成器表达式中的条件部分:

sum(1 for i, j in zip(a, b) if i != j)

我其实觉得这两种写法没有哪个更容易读懂,而且我也怀疑它们在性能上会有什么区别。

撰写回答