2015-12-08 3 views
0

Моему вопросу может быть довольно сложно объяснить (возможно, это также причина, по которой я не нашел решения или аналогичной проблемы).python - объединить элементы списка всеми возможными способами

У меня есть список с некоторыми элементами (в моем конкретном случае также перечислены). Я хочу иметь все возможные комбинации конкатенаций этого списка в том же порядке.

Например:

[[1], [2], [3], [4]] # what I have 

{      # what I want 
    [[1], [2], [3], [4]], 
    [[1, 2], [3], [4]], 
    [[1], [2, 3], [4]], 
    [[1], [2], [3, 4]], 
    [[1, 2], [3, 4]], # Update 1 
    [[1, 2, 3], [4]], 
    [[1], [2, 3, 4]], 
    [[1, 2, 3, 4]] 
} 

В целом длина подсписков больше, затем 1; также сам список может содержать более 4 элементов.

Любая помощь очень ценится.

UPDATE 1: не использовался недостающий комбинация в коде.

+1

itertools.combinations – Praveen

+2

Что случилось с '[[1, 2], [3, 4]]'? – TigerhawkT3

+1

@ TigerhawkT3 У меня была такая же мысль. В общем случае количество результирующих списков должно быть всегда равным двум, если я правильно понимаю проблему (это должно быть 2 ** (n-1), где n - исходная длина списка). –

ответ

4

Попробуйте это:

def concats(l): 
    if len(l) < 2: 
     return [l] 

    return [[l[0]] + x for x in concats(l[1:])] + \ 
      concats([l[0] + l[1]] + l[2:]) 

Вот пример случай:

l = [[1], [2], [3], [4]] 
r = concats(l) 

И результат:

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

Edit: Это не было для меня ясно, как пустой список должен быть обработан, но в этом случае вам может понадобиться просто вернуть пустой список, не обернув его во внешний список - я оставлю это c асе до вас. Простая проверка в верхней части функции может обрабатывать ее любым способом, который вы выберете (и это не повлияет на более крупные случаи).

+0

Это потрясающе, именно то, что мне нужно. Большое спасибо :) – yoshegg

+0

Рад, что это помогло :) Я также просто добавил примечание внизу о пустом случае списка, так как я не был уверен, как это должно быть обработано. –

Смежные вопросы