您可以使用 itertools.combinations 来简化您的代码,该代码完全符合您的要求。
diffs = [y - x for x, y in itertools.combinations(list, 2)]
可能有一些非常复杂、聪明的算法可以在 O(n log n) 内完成此操作,但任何“正常”算法都必须查看每一对元素,并且有 n (n + 1 ) / 2 个这样的对。
============== 为线性解决方案编辑====
好的。只需确认您是专门要求差异,而不是解决方案中差异的绝对值。如果您正在寻找他们的总和,而不仅仅是列表,您可以做一些数学运算。
查看列表[a, b, c, d]。你要
(b - a) + (c - a) + (d - a) + (c - b) + (d - b) + (d-c)
简化为-3*a - b + c + 3*d
很容易概括并看到对于 n 个元素的列表,乘数是 -(n-1), -(n - 3), .... n-3, n-1 所以你有
n = len(list)
sum(value * multiplier for value, multiplier in zip(list, range(-n+1, n, 2))```