2017-08-31 6 views
3

sagen, dass ich eine Stringliste haben:alle möglichen Kombinationen von Zeichen in einem String generieren

li = ['a', 'b', 'c'] 

Ich möchte eine neue Liste erstellen, so dass jeder Eintrag der neuen Liste eine Verkettung von einer Auswahl von 3 Einträge in der ursprünglichen Liste. Man beachte, daß jeder Eintrag wiederholt gewählt werden kann:

new_li=['abc', 'acb', 'bac', 'bca', 'cab', 'cba', 'aab', 'aac',....'aaa', 'bbb', 'ccc'] 

Der brutale Kraft Weg ist ein 3-fach für Schleife verschachtelt zu konstruieren und legt jeweils 3-Kombination in die neue Liste. Ich habe mich gefragt, ob es irgendeinen pythonischen Weg gibt, damit umzugehen? Vielen Dank.

Update: Später werde ich die neue Liste in einen Satz konvertieren, so dass der Auftrag nicht ohnehin keine Rolle.

+0

Muss es zufällig sein? Wie lange sollte die Liste sein? –

+0

@ whackamadoodle3000 Bitte beachten Sie die Updates. Die Länge der Liste sollte 3^n sein, wobei n die Anzahl der Einträge in der ursprünglichen Liste – James

Antwort

3

Das sieht wie ein Job für itertools.product.

import itertools 

def foo(l): 
    yield from itertools.product(*([l] * 3)) 

for x in foo('abc'): 
    print(''.join(x)) 

aaa 
aab 
aac 
aba 
abb 
abc 
aca 
acb 
acc 
baa 
bab 
bac 
bba 
bbb 
bbc 
bca 
bcb 
bcc 
caa 
cab 
cac 
cba 
cbb 
cbc 
cca 
ccb 
ccc 

yield from steht Ihnen von python3.3 zur Verfügung und darüber hinaus. Für ältere Version, yield innerhalb einer Schleife:

def foo(l): 
    for i in itertools.product(*([l] * 3)) : 
     yield i 
+0

Dank. Was passiert, wenn jeder Eintrag in der ursprünglichen Liste ist nicht ein einzelne Zeichen, wie li = [ ‚a1‘, ‚b2‘, ‚c3‘]? – James

+1

@James Es funktioniert genau so. Du könntest es einfach versuchen. –

1

Der beste Weg, um alle Kombinationen (auch als kartesisches Produkt) von einer Liste zu bekommen, ist itertools.product mit den len Ihrer iterable als repeat Argument zu verwenden (das ist, wo es unterscheidet von der anderen Antwort):

from itertools import product 
li = ['a', 'b', 'c'] 
for comb in product(li, repeat=len(li)): 
    print(''.join(comb)) 

oder wenn Sie das Ergebnis als Liste mögen:

>>> combs = [''.join(comb) for comb in product(li, repeat=len(li))] 
>>> combs 
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 
'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 
'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc'] 

Es ist ein bisschen sauberer das repeat Argument zu verwenden, als sich zu vermehren und die Liste Sie manuell entpacken.

Verwandte Themen