在Python中,找出两个有序列表之间的差异数量

时间:2013-02-16 20:08:31

标签: python list

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

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

并找出差异的数量n,在这种情况下,它将是n = 2,如果长度不相等,也会返回错误。这样做的pythonic方式是什么?

3 个答案:

答案 0 :(得分:19)

最简单的方法是使用the sum() built-ingenerator expression

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)

我不能说我觉得一个人比另一个人更具可读性,并且怀疑会有性能差异。

答案 1 :(得分: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。然后我们将这个函数映射到2个列表中并获取列表[False,True,False,True,False] 如果我们在函数map()中放入不同长度的列表,我们得到TypeError

最后,这个布尔列表的函数sum()得到2。

答案 2 :(得分:-1)

您可以使用sets。将两者都投射到一组,然后找出两者之间的差异。例如:

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

这可以包含在一个函数中,以便首先检查长度差异。