10

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

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

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

4

3 回答 3

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)

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

于 2013-02-16T20:10:31.357 回答
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。

于 2013-02-16T20:27:00.070 回答
-2

你可以使用sets。将两者都投射到一个集合中,然后找到两者之间的差异。例如:

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

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

于 2013-02-16T20:15:38.277 回答