python - 列表中所有对的乘积之和

标签 python python-3.x list-comprehension

我想对列表中所有不同对的乘积求和。我编写了以下正确计数的代码: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/

相关文章:

python - 在我的 Mac 上以 root 身份运行 pip 时出现 "Permission Denied"

python - 如何将 sklearn.metrics.pairwise pairwise_distances 与可调用指标一起使用?

python - Python 新手(编程)和数据存储

python - 使用Python递归生成组合

for循环中的Python列表初始化

Python 理解 : for x in [temp for temp in xlist if temp<=xmax]:

python - 具有固定参数的曲线拟合分段函数

python - 运行时错误: RecursionError: maximum recursion depth exceeded while calling a Python object

python - 列表理解 : References to the Components

python - pandas 将系列值折叠成一个值