2010-05-14 14 views
5

Was ist ein einfacher Weg, um die Länge einer Zeichenfolge auf eine beliebige ganze Zahl x zu erhöhen? wie 'a' geht zu 'z' und dann geht 'aa' zu 'zz' zu 'aaa' usw.zunehmende String-Größe durch Schleife

+0

Wo 'X' reinkommen? Wenn die Zeichenfolge "abc" ist und "x" 4 ist, wird die Zeichenfolge "abg"? –

+0

oops. Ich wollte sagen, dass die Zeichenfolge x lang wird, also wenn x = 4 wäre, wären die Strings "aaaa" ... "zzzz" – calccrypto

+0

Etwas verwandt, siehe [dieser Code Golf] (http://stackoverflow.com/questions/ 2634427/code-golf-numeric-äquivalent-eines-excel-spaltenname /). –

Antwort

6

, die den Trick tun sollten:

def iterate_strings(n): 
    if n <= 0: 
     yield '' 
     return 
    for c in string.ascii_lowercase: 
     for s in iterate_strings(n - 1): 
      yield c + s 

Es gibt einen Generator. Sie können es mit einem iterieren for-Schleife:

for s in iterate_strings(5) 

Oder eine Liste der Strings erhalten:

list(iterate_strings(5)) 

Wenn auch Sie über kürzere Strings iterieren möchten, können Sie diese Funktion nutzen zu können:

def iterate_strings(n): 
    yield '' 
    if n <= 0: 
     return 
    for c in string.ascii_lowercase: 
     for s in iterate_strings(n - 1): 
      yield c + s 
+0

obwohl es rückwärts geht, cool! – calccrypto

+0

Das Problem wurde behoben. Vote für meine Antwort bitte :) – Adam

+0

Ich habe versucht, aber anscheinend brauche ich 15 Ruf – calccrypto

0

Sie können die Zeichenkette in der ganzen Zahl multiplizieren. Zum Beispiel

>>> 'a' * 2 
'aa' 
>>> 'a' * 4 
'aaaa' 
>>> 'z' * 3 
'zzz' 
>>> 'az' * 3 
'azazaz' 
+0

Ja, aber ich möchte alle Permutationen durchlaufen – calccrypto

+0

Mal sehen, ob ich dich richtig verstehe: Du willst über alle Strings zwischen 'aaaa' und 'zzzz' ('aaaa', 'aaab', 'aaac') iterieren , .... 'zzzz'). – Adam

+0

korrekt. den ganzen Weg, bis die Zeichenfolge x Zeichen lang ist – calccrypto

0

Definieren x. Ich verwende x = 5 für dieses Beispiel.

x = 5 
import string 
for n in range(1,x+1): 
    for letter in string.ascii_lowercase: 
    print letter*n 
+0

Sie können den Startwert der Bereichsanweisung festlegen, da die allererste Sache, die mit diesem Code gedruckt wird, 26 Zeilen von Leerzeichen ist, weil Sie zuerst 'Buchstabe * 0 'tun. – Dustin

+0

Sehr wahr. Fest. – tdedecko

2

Hier ist meine Lösung, ähnlich wie bei Adam, außer dass es nicht rekursiv ist. :].

from itertools import product 
from string import lowercase 

def letter_generator(limit): 
    for length in range(1, limit+1): 
     for letters in product(lowercase, repeat=length): 
      yield ''.join(letters) 

Und es gibt ein generator, so dass Sie eine for Schleife iterieren es verwenden können:

for letters in letter_generator(5): 
    # ... 

Viel Spaß!

(Dies ist das zweite Mal heute fand ich itertools.product() nützlich. Woot.)