python查找列表中多个数字之间的距离

时间:2013-07-24 08:50:19

标签: python list distance elements

我的输出看起来像这样:

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)

我是在正确的轨道上吗?

3 个答案:

答案 0 :(得分: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一样有效)运行我认为你追求的计算

答案 1 :(得分:1)

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

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

如果通过组合,表示行中所有值的所有可能对,则表示由r表示的组合长度为2。

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)

答案 2 :(得分: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
...