我想对列表中所有不同对的乘积求和。我编写了以下正确计数的代码:1*2 + 1*3 + 1*4 + 2*3 + 2*4 + 3*4
l = [1, 2, 3, 4]
def sum_of_pairs(ls):
return sum([x * y for x in ls for y in ls[ls.index(x) + 1:]])
print(sum_of_pairs(l))
当我尝试将列表更改为 l = [1, 1, 1, 1]
时,它返回 12(而不是 6)。
为什么会发生这种情况?
最佳答案
眼前的问题是您正在使用ls.index
来查找从哪里开始内部循环。 list.index
返回第一个匹配项的索引,因此只有在列表中没有重复项时才会执行您想要的操作。另一个问题是,它会对外循环的每次迭代执行列表的线性搜索,从而使您的算法效率不必要地低下。
有许多解决方法可用。一个简单的方法是使用 enumerate
跟随您想要的索引:
sum(n * ls[j] for i, n in enumerate(ls) for j in range(i + 1, len(ls)))
或者您可以使用一对 range
对象:
sum(ls[i] * ls[j] for i in range(len(ls)) for j in range(i + 1, len(ls)))
创建一个范围
通常比每次复制整个子列表要便宜,就像
sum(x * y for i, x in enumerate(ls) for y in ls[i + 1:])
或者,您可以使用 itertools.combinations
更有效地为您生成值:
sum(x * y for x, y in itertools.combinations(ls, 2))
关于python - 列表中所有对的乘积之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58593271/