我想比较两个长度相同的列表
a = [1, 3, 5, 7, 9]
b = [1, 2, 5, 7, 3]
并找出差异的数量n
,在这种情况下,它将是n = 2
,如果长度不相等,也会返回错误。这样做的pythonic方式是什么?
答案 0 :(得分:19)
最简单的方法是使用the sum()
built-in和generator 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 == 1
和False == 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
这可以包含在一个函数中,以便首先检查长度差异。