我想比较两个相同长度的列表
a = [1, 3, 5, 7, 9]
b = [1, 2, 5, 7, 3]
并找出差异的数量n
,在这种情况下它将是n = 2
,如果长度不相等,也会返回错误。这样做的pythonic方式是什么?
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)
我真的不能说我觉得一个比另一个更具可读性,并且怀疑会有性能差异。
如果长度不相等也会产生错误的单行解决方案:
>>> 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。
你可以使用sets。将两者都投射到一个集合中,然后找到两者之间的差异。例如:
>>> a = [1,3,5,7,9]
>>> b = [1,2,5,7,2]
>>> len(set(a) - set(b))
2
这可以包含在一个函数中,以首先检查长度差异。