1

我有一个如下所示的输出:

output=[[[], [], [], [1582, 2912, 3109, 5711], []],
[[], [1182, 1432, 2127, 2274, 2613, 3024, 3703, 4723, 5288, 5438], [], []],
[[], [], [], [], [27, 574, 835, 1221, 1388, 1525, 1842, 2070, 2547, 3578, 3798, 3932, 4066, 4157, 4350, 4567, 4709, 5176, 5564, 5744], [], []],
[[], [], [], [], []],
[[]],
[[], []],
[[], [1182, 1432, 2127, 2274, 2613, 3024, 3703, 4723, 5288, 5438], [], [], [1452, 2120, 5628]],
[[3610], []],
[[], [], [], []],
[[3842], []],
[[1566], [3842], []],
[[5182, 5569], [], []],
[[], [3842], [], [], [1452, 2120, 5628]],
[[], [], []],
[[]],
[[], [377, 576, 2682, 3071, 5760], [900, 1723, 2658, 3076], []],
[[], []],
[[], [], [], [], [1452, 2120, 5628]],
[[], [1182, 1432, 2127, 2274, 2613, 3024, 3703, 4723, 5288, 5438], [], []]]

对于输出的每一行,我需要找到一个列表中的数字与该行的另一个列表中的数字的所有可能距离组合。例如,对于行:

[[1566], [3842], []],

我只需要找到距离(1566-3842),但对于行:

[[], [377, 576, 2682, 3071, 5760], [900, 1723, 2658, 3076], []],

我需要找到所有可能的距离组合。有人可以告诉我一个快速的方法吗?非常感谢。

我正在考虑做这样的事情:

>>> dis=[]
>>> for i in range(len(output)):
    for j in output[i]: 
        if any(abs(num-numb) for num in output[i] for numb in output[i+1]):
            di=abs(num-numb)
            dis.append(di)

我在正确的轨道上吗?

4

3 回答 3

1

有趣的问题,感谢您的代码片段。我会进行列表理解,但也会丢弃您不需要的任何空列表:

在伪代码中:

for each line in your output:
    remove the blank results
    if there are 2 result sets,
        then calculate all (x - y) combinations of distances

在 Python 中:

combinations = []
for line in output:
    result = [i for i in line if i]
    if len(result) > 1:
        combinations.append([abs(x - y) for x in result[0] for y in result[1]])

combinations.append()使用一个列表理解,它可以有效地(以及,像 Python 一样有效地)运行我认为你所追求的计算

于 2013-07-24T09:40:11.923 回答
1

看起来您的行是嵌套的,这意味着一行包含一些子列表,每个子列表都包含一些距离值或根本没有。看起来您想要整行的所有距离值组合。

在这种情况下,对于任何行,您都可以展平列表,然后使用itertools.combinations.

如果通过组合,您的意思是该行中所有值的所有可能对,那么这意味着由 表示的组合长度为r2。

dis = []
for row in output:
    flatrow = sum(row, [])
    for a, b in itertools.combinations(flatrow, 2):
        di = abs(a - b)
        if di:
            dis.append(di)
于 2013-07-24T09:40:21.037 回答
1

您可能正在寻找itertools.product

from itertools import product

row = [[], [377, 576, 2682, 3071, 5760], [900, 1723, 2658, 3076], []]
values = [l for l in row if l] # filter empty lists from the row
for line in ['{} to {}:\t{}'.format(a, b, abs(a-b)) for (a, b) in product(*values)]:
  print line

输出:

377 to 900:     523  
377 to 1723:    1346
377 to 2658:    2281
377 to 3076:    2699
576 to 900:     324
576 to 1723:    1147
576 to 2658:    2082
576 to 3076:    2500
2682 to 900:    1782
2682 to 1723:   959
...
于 2013-07-24T09:40:27.857 回答