在Python中计算两个有序列表之间的差异数量
我想比较两个长度相同的列表
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 == 1
和 False == 0
,所以我们只需要把这些结果相加,就能得到不同的数量。另一种选择是使用生成器表达式中的条件部分:
sum(1 for i, j in zip(a, b) if i != j)
我其实觉得这两种写法没有哪个更容易读懂,而且我也怀疑它们在性能上会有什么区别。