2016-01-02 4 views
2

У меня есть программа, которая выводит решения, которые являются списки номеров, как например:Как сгладить список в python?

[[1, [[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]], [2, [[1, 4], [2, 3], [3, 2], [4, 1]]], [3, [[1, 3], [2, 2], [3, 1]]], [4, [[1, 2], [2, 1]]], [5, [[1, 1]]]] 

То, что я хочу, чтобы это превратится в это:

[[1,1,5],[1,2,4],[1,3,3],[1,4,2],[1,5,1],[2,1,4],[2,2,3],[2,3,2],[2,4,1],[3,1,3],[3,2,2],[3,3,1],[4,1,2],[4,2,1],[5,1,1]] 

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

+1

Похоже, интересный вопрос, но это не очень хорошо объяснено. «1 является частью всех решений» «6 запускает новое решение», как рассчитывается «решение»? Например, у вас есть следующий объект в вашем выходном массиве «[6,7,8]», по какой логике вы включили 8 и пропустили 9? – par

+1

Итак, это программа для расчета списков чисел определенной длины, которые составляют до определенного числа. Извините, этот пример был немного мусором. Изменение его на пробный выход из программы. – Mrahta

ответ

0

Это должно сработать. Он работает с примером, который у вас по крайней мере.

result = [[[i[0]] + j for j in i[1:][0] ] for i in arr][0] 
0

Введем две функции: merge и flatten.

Вторая функция берется из here:

def flatten(lst): 
    return [item for sublist in lst for item in sublist] 

Первая функция определяется следующим образом:

def merge(lst): 
    return [[lst[0]] + x for x in flatten(lst[1:])] 

Затем их называют:

s = [[1, [[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]], [2, [[1, 4], [2, 3], [3, 2], [4, 1]]], [3, [[1, 3], [2, 2], [3, 1]]], [4, [[1, 2], [2, 1]]], [5, [[1, 1]]]] 
print flatten([merge(x) for x in s]) 

Выход:

[[1, 1, 5], [1, 2, 4], [1, 3, 3], [1, 4, 2], [1, 5, 1], [2, 1, 4], [2, 2, 3], [2, 3, 2], [2, 4, 1], [3, 1, 3], [3, 2, 2], [3, 3, 1], [4, 1, 2], [4, 2, 1], [5, 1, 1]] 
0
items = [[1, [[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]], [2, [[1, 4], [2, 3], [3, 2], [4, 1]]], [3, [[1, 3], [2, 2], [3, 1]]], [4, [[1, 2], [2, 1]]], [5, [[1, 1]]]] 
flat_items = [] 
for item in items: 
    leading = item[0] 
    for i in item[1]: 
     flat_items.append([leading]+i) 
print(flat_items) 
+0

Это работает здесь, но если списки идут глубже, поэтому вместо этого [1,5] было что-то вроде [1, [2,3]], я хотел бы, чтобы он выводил [[1,1,2], [1,1,3], ... как и в коде, вам нужно будет делать то, что ваш делает для [1, [2,3]], но затем использовать это снова с оригиналом 1, и это может пойти на неопределенный срок. – Mrahta

0

Еще одно решение, которое дает вам выход, как вам необходимо:

def flatten(lst): 
    result = [] 
    for i in lst: 
     for j in i[1]: 
      pair = j[:] 
      pair.insert(0, i[0]) 
      result.append(pair) 
    return result 
Смежные вопросы