Python находит расстояния между несколькими числами в списке

У меня есть вывод, который выглядит так:

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)

Я на правильном пути?


person user2496006    schedule 24.07.2013    source источник
comment
Спасибо, отредактирую пост.   -  person user2496006    schedule 24.07.2013
comment
Немного лучше; вы можете указать, с какими проблемами вы столкнулись при таком подходе, и почему он не работает. Таким образом, мы помогаем вам помочь себе.   -  person Martijn Pieters    schedule 24.07.2013
comment
В описании вы упоминаете каждую строку как бы самостоятельную. Но в коде кажется, что вы ищете комбинации между последовательными строками. Код неправильный?   -  person RussW    schedule 24.07.2013


Ответы (3)


Похоже, ваши строки вложены друг в друга, то есть строка содержит некоторое количество подсписков, каждый из которых содержит определенное количество значений расстояния или вообще не содержит. Похоже, вам нужны все комбинации значений расстояния для всей строки.

В этом случае для любой строки вы можете сгладить список, а затем использовать 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)
person RussW    schedule 24.07.2013

Вероятно, вы ищете 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
...
person sloth    schedule 24.07.2013

Интересный вопрос, и спасибо за фрагмент кода. Я бы пошел на понимание списка, но также отбросил бы все пустые списки, которые вам не нужны:

В псевдокоде:

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

В Питоне:

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) выполняет вычисление, которое, я думаю, вам нужно

person Nick Burns    schedule 24.07.2013