我想要比较两个长度相同的列表
a = [1, 3, 5, 7, 9]
b = [1, 2, 5, 7, 3]
找出两个字符串之间的不同字符数n
,在这种情况下n = 2
,如果长度不相等则返回错误。有什么符合Python风格的方法吗?
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
map()
和lambda
通常比列表推导式/生成器表达式更慢且不易读取,并且仅适用于数字。 - Gareth Lattylambda
函数。此外,使用他的解决方案,我可以定义错误消息,以便知道出现了什么错误。 - LWZ>>> a = [1,3,5,7,9]
>>> b = [1,2,5,7,2]
>>> len(set(a) - set(b))
2
difference([1, 3, 5, 7, 9], [9, 7, 5, 3, 1])
的结果是 0
而不是 4
。原帖中的例子将 3
计为不同的元素,尽管它在两个列表中都存在(也就是说,位置很重要)。此外,这种方法也忽略了列表长度可能不同的情况,正如问题中所提到的。 - Gareth Latty
1 for i
,而不是隐式布尔值(依赖于它是一个int
),但无论如何 +1(只要长度检查是显式的)。 - Jon Clements