2013-05-02 7 views
6

Mein Ziel ist es, alle möglichen Zeichenfolgen (Buchstaben und Zahlen) der Länge x erzeugen zu können und für jeden einen Code-Block aktivieren zu können. (wie ein Iterator) Das einzige Problem ist, dass diejenigen in den Itertools keine Kopien des Buchstabens in der gleichen Zeichenfolge erstellen. Zum Beispiel:Wie generiert man alle möglichen Zeichenfolgen in Python?

Ich bekomme "ABC" "BAC" "CAB" etc. anstelle von "AAA".

Irgendwelche Vorschläge?

Antwort

21

Verwendung itertools.product():

>>> import itertools 
>>> map(''.join, itertools.product('ABC', repeat=3)) 
['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'] 

Beachten Sie, dass Erstellen einer Liste alle Kombinationen enthält, die für längere Strings sehr ineffizient ist - statt über sie iterieren:

for string in itertools.imap(''.join, itertools.product('ABC', repeat=3)): 
    print string 

Um alle Zeichen zu erhalten und Zahlen verwenden string.uppercase + string.lowercase + string.digits.

+1

Python 3 wurde geändert, so dass die eingebaute 'map' nun einen Iterator zurückgibt. Der zweite Vorschlag, "itertools.imap" zu verwenden, ist nicht notwendig, es sei denn, Ihre Version von Python ist <3.0. – ngoue

+2

Die Frage ist markiert [tag: python-2.7] ... – ThiefMaster

+0

Sie haben Recht, Herr! – ngoue

6

Verwenden itertools.product() wenn Sie Buchstaben wiederholen:

>>> from itertools import product 
>>> from string import ascii_uppercase 
>>> for combo in product(ascii_uppercase, repeat=3): 
...  print ''.join(combo) 
... 
AAA 
AAB 
... 
ZZY 
ZZZ 

itertools.combinations() und itertools.permutations() sind nicht die richtigen Werkzeuge für Ihre Arbeit.

Verwandte Themen