python – 有效地找到列表元素的差异

我试图找到列表元素与列表中每个元素的列表的所有元素之间的差异.我想我就是这样描述的?让我们用一个例子代替:

idx = [1, 4, 8, 10, 22]

基于this question,将元素压缩在一起就足够简单,但这会导致每个元素只进行一次成对比较,而我需要对每个元素进行多次成对比较.

我的方法是做以下事情:

diffs = [abs(i-j) for i in idx for j in idx]

但这非常低效.计算以下所有元组的差异的最有效方法是什么?

comparisons = [(1,4), (1,8), (1,10), (1, 22), 
               (4,8), (4,10), (4,22), 
               (8,10, 8,22)]

注意:

我更喜欢使用基础Python 2.7的答案,但也想知道如何使用Numpy这样做,因为我确信包使它更容易.

最佳答案 你可以写一个发电机:

idx = [1, 4, 8, 10, 22]

def differences(nums):
    n = len(nums)
    for i in xrange(n-1):
        for j in xrange(i+1,n):
            yield abs(nums[i]-nums[j])

for d in differences(idx): print d

输出:

3
7
9
21
4
6
18
2
14
12

这会逐个产生差异,内存开销很小.此外,使用@RoryDaulton的想法,这并不打算计算冗余或已知为零的差异.

点赞