2016-04-07 12 views
0

Nehmen wir an, ich habe eine Liste von ganzen Zahlen bekam:Python: eine Liste in alle möglichen Teillisten brechen

mylist = [101, 102, 103, 104, 105, 106] 

Jetzt brauche ich jede mögliche sublist Division (Auftrag erhalten) zu erstellen:

sublists = [([101], [102, 103, 104, 105, 106]), 
      ([101, 102], [103, 104, 105, 106]), 
      ([101, 102, 103], [104, 105, 106]), 
      ... 
      ([101, 102], [103, 104], [105, 106]), 
      ... 
      ([101], [102, 103, 104], [105], [106]), 
      ... 
      ([101], [102], [103], [104], [105], [106])] 

Irgendeine Idee? Wäre itertools hilfreich?

+0

Dies ist kein Duplikat von [Python: Zeige alle möglichen Gruppierungen einer Liste, wobei nur die Anzahl der Unterlisten angegeben wird (die Längen sind variabel)] (https://stackoverflow.com/q/9088321); Diese Frage produziert nur eine feste Anzahl von Splits an allen möglichen Orten. –

+0

@MartijnPieters - Nur ein Split? '>>> Liste (split_list ([1, 2, 3, 4], 3))' -> '[[[1], [2], [3, 4]], [[1], [2, 3], [4]], [[1, 2], [3], [4]]] ' – TigerhawkT3

+0

@ TigerhawkT3: also müsstest du radeln und mehr und mehr Splits erstellen. Es kann viel effizienter für diesen Anwendungsfall getan werden. –

Antwort

2

Sie erstellen Schnittpunkte; Schneiden Sie nach dem aktuellen Element oder nicht. Sie können diese mit booleans erzeugen:

from itertools import product 

def sublists(lst): 
    for doslice in product([True, False], repeat=len(lst) - 1): 
     slices = [] 
     start = 0 
     for i, slicehere in enumerate(doslice, 1): 
      if slicehere: 
       slices.append(lst[start:i]) 
       start = i 
     slices.append(lst[start:]) 
     yield slices 

Demo:

>>> from pprint import pprint 
>>> mylist = [101, 102, 103, 104, 105, 106] 
>>> pprint(list(sublists(mylist))) 
[[[101], [102], [103], [104], [105], [106]], 
[[101], [102], [103], [104], [105, 106]], 
[[101], [102], [103], [104, 105], [106]], 
[[101], [102], [103], [104, 105, 106]], 
[[101], [102], [103, 104], [105], [106]], 
[[101], [102], [103, 104], [105, 106]], 
[[101], [102], [103, 104, 105], [106]], 
[[101], [102], [103, 104, 105, 106]], 
[[101], [102, 103], [104], [105], [106]], 
[[101], [102, 103], [104], [105, 106]], 
[[101], [102, 103], [104, 105], [106]], 
[[101], [102, 103], [104, 105, 106]], 
[[101], [102, 103, 104], [105], [106]], 
[[101], [102, 103, 104], [105, 106]], 
[[101], [102, 103, 104, 105], [106]], 
[[101], [102, 103, 104, 105, 106]], 
[[101, 102], [103], [104], [105], [106]], 
[[101, 102], [103], [104], [105, 106]], 
[[101, 102], [103], [104, 105], [106]], 
[[101, 102], [103], [104, 105, 106]], 
[[101, 102], [103, 104], [105], [106]], 
[[101, 102], [103, 104], [105, 106]], 
[[101, 102], [103, 104, 105], [106]], 
[[101, 102], [103, 104, 105, 106]], 
[[101, 102, 103], [104], [105], [106]], 
[[101, 102, 103], [104], [105, 106]], 
[[101, 102, 103], [104, 105], [106]], 
[[101, 102, 103], [104, 105, 106]], 
[[101, 102, 103, 104], [105], [106]], 
[[101, 102, 103, 104], [105, 106]], 
[[101, 102, 103, 104, 105], [106]], 
[[101, 102, 103, 104, 105, 106]]] 

Wenn Sie den letzten Eintrag löschen möchten (eine Liste mit nur einer Liste darin, wiederum enthält alle Elemente enthält), ersetzen die letzten 2 Zeilen mit:

if start: 
    slices.append(lst[start:]) 
    yield slices 
0

Dies ist eine interessante Frage! Obwohl Martijn an elegant answer gegeben hat, würde ich immer noch meine schreiben mag, das dieses Problem aus einem anderen Blickwinkel angeht - Teile & Conquer:

def sublist_gen(ls): 
    n = len(ls) 
    if n == 1: 
     yield [ls] 
    else: 
     for left in sublist_gen(ls[0:n/2]): 
      for right in sublist_gen(ls[n/2:n]): 
       yield left + right 
       yield left[0:-1] + [left[-1] + right[0]] + right[1:] 

mylist = [101, 102, 103, 104, 105, 106] 
for sublist in sublist_gen(mylist): 
    print(sublist) 

Ergebnis:

[[101], [102], [103], [104], [105], [106]] 
[[101], [102], [103, 104], [105], [106]] 
[[101], [102], [103], [104, 105], [106]] 
[[101], [102], [103, 104, 105], [106]] 
[[101], [102], [103], [104], [105, 106]] 
[[101], [102], [103, 104], [105, 106]] 
[[101], [102], [103], [104, 105, 106]] 
[[101], [102], [103, 104, 105, 106]] 
[[101, 102], [103], [104], [105], [106]] 
[[101, 102], [103, 104], [105], [106]] 
[[101, 102], [103], [104, 105], [106]] 
[[101, 102], [103, 104, 105], [106]] 
[[101, 102], [103], [104], [105, 106]] 
[[101, 102], [103, 104], [105, 106]] 
[[101, 102], [103], [104, 105, 106]] 
[[101, 102], [103, 104, 105, 106]] 
[[101], [102, 103], [104], [105], [106]] 
[[101], [102, 103, 104], [105], [106]] 
[[101], [102, 103], [104, 105], [106]] 
[[101], [102, 103, 104, 105], [106]] 
[[101], [102, 103], [104], [105, 106]] 
[[101], [102, 103, 104], [105, 106]] 
[[101], [102, 103], [104, 105, 106]] 
[[101], [102, 103, 104, 105, 106]] 
[[101, 102, 103], [104], [105], [106]] 
[[101, 102, 103, 104], [105], [106]] 
[[101, 102, 103], [104, 105], [106]] 
[[101, 102, 103, 104, 105], [106]] 
[[101, 102, 103], [104], [105, 106]] 
[[101, 102, 103, 104], [105, 106]] 
[[101, 102, 103], [104, 105, 106]] 
[[101, 102, 103, 104, 105, 106]] 
Verwandte Themen