2015-10-02 9 views
6

Ich habe eine Liste ['a', 'b', 'c', 'd'] und brauche eine Liste ['a', 'ab', 'abc', 'abcd', 'b' , 'bc', 'bcd', 'c', 'cd', 'd'].Wie erstellt man eine sequentielle kombinierte Liste in Python?

Ich habe mir itertools angesehen, aber ich sehe nicht, wie man das funktioniert.

Für all combinations, würde der Code:

from itertools import permutations 
stuff = ['a','b','c','d'] 
for i in range(0, len(stuff)+1): 
    for subset in permutations(stuff, i): 
      print(subset) 

Was brauche ich, um nur sequentielle Kombinationen zurückkehren zu tun? Ich denke, ich könnte die Reihenfolge für jede Permutation überprüfen, wie ich gehe, aber das scheint nicht der beste Weg zu sein.

+0

Sie benötigen '‚abc'' und '‘ d' 'auch dort? Weil ich sonst keine Logik in deiner Liste sehe. – Evert

+0

Sollte ''abc'' auch in der Liste sein, die Sie erstellen möchten? – BrianO

+2

so etwas wie 'print ([''. Join (stuff [i: j]) für i in range (len (stuff)) für j in range (i + 1, len (stuff) +1)])' – njzk2

Antwort

5

Ganz einfach:

stuff = ['a','b','c','d'] 
print([''.join(stuff[i:j]) for i in range(len(stuff)) for j in range(i+1, len(stuff)+1)]) 

Gibt

['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd'] 
+0

Das Zeug in der Liste wird mehr als ein Zeichen sein ... Wird das ein Problem verursachen? – Joseph

+0

@Joseph Ich verstehe nicht? Die Anzahl der Zeichen in einem einzelnen Element spielt keine Rolle. – njzk2

+0

Entschuldigung ... ging für eine Sekunde gehirn tot ... sah len() und dachte len (Zeichen) – Joseph

1

Sie mit einer Liste in Verständnis tun könnte:

>>> [''.join(['a', 'b', 'c', 'd'])[i:j+1] for i in range(4) for j in range(i, 4)] 
['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd'] 

Nicht sicher, ob Sie es auf diese Weise, obwohl tun wollen.

1

Ich denke, das den Trick tun sollten:

items = ['a', 'b', 'c', 'd'] 
combinations = [] 
for i, x in enumerate(items): 
    combinations.append(x) 
    accum = x 
    for y in items[i+1:]: 
     accum += y 
     combinations.append(accum) 
1

Diese Funktion macht es:

def subsequences(lst): 
    return [''.join(lst[i: j+1]) 
      for i in range(len(lst)) 
      for j in range(i, len(lst))] 

>>> subsequences(['a', 'b', 'c']) 
['a', 'ab', 'abc', 'b', 'bc', 'c'] 
>>> subsequences(['a', 'b', 'c', 'd']) 
['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd'] 
1

Noch eine andere mögliche Lösung (ohne itertools), diesmal eine Hilfsprozedur für Klarheit mit:

def combine(lst): 
    return [''.join(lst[0:i+1]) for i in xrange(len(lst))] 

lst = ['a', 'b', 'c', 'd'] 
sum([combine(lst[i:]) for i in xrange(len(lst))], []) 
=> ['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']