2015-03-30 11 views
6

Vorrei creare un elenco alfabetico per un'applicazione simile a un foglio di lavoro Excel.Come creare un python elenco alfabetico continuo (da a-z quindi da aa, ab, ac ecc.)

Un utente immette il numero di celle e vorrei generare un elenco. Ad esempio un utente ha bisogno di 54 celle. Quindi vorrei generare

'a', 'b', 'c', ..., 'z', 'aa', 'ab', 'ac', ..., 'az', 'ba ', 'BB'

faccio a generare la lista da [ref]

from string import ascii_lowercase 
L = list(ascii_lowercase) 

Come faccio a Stitch insieme? Una domanda simile per PHP è stata richiesta here. Qualcuno ha l'equivalente Python?

risposta

13

Utilizzare itertools.product.

from string import ascii_lowercase 
import itertools 

def iter_all_strings(): 
    size = 1 
    while True: 
     for s in itertools.product(ascii_lowercase, repeat=size): 
      yield "".join(s) 
     size +=1 

for s in iter_all_strings(): 
    print s 
    if s == 'bb': 
     break 

Risultato:

a 
b 
c 
d 
e 
... 
y 
z 
aa 
ab 
ac 
... 
ay 
az 
ba 
bb 

Questo ha il vantaggio di andare ben al di là combinazioni di due lettere. Se hai bisogno di un milione di stringhe, ti darà felicemente tre, quattro e cinque stringhe di lettere.


Bonus consiglio di stile: se non ti piace avere un esplicito break all'interno del ciclo in basso, è possibile utilizzare islice per rendere il ciclo termina sul proprio:

for s in itertools.islice(iter_all_strings(), 54): 
    print s 
1

È possibile utilizzare una comprensione di lista.

from string import ascii_lowercase 
L = list(ascii_lowercase) + [letter1+letter2 for letter1 in ascii_lowercase for letter2 in ascii_lowercase] 
+0

Questo non sembra per ottenere quello che lettera combinazioni 'a', 'b', ecc – Kevin

+0

@ Kevin, ho aggiunto le singole lettere 'a', 'b', ... –

+0

Ok, ma cosa succede se l'utente ha bisogno di più di 702 stringhe diverse? Dovranno andare oltre "zz" in "aaa". – Kevin

1

seguito @ Kevin ' Risposta:

from string import ascii_lowercase 
import itertools 

# define the generator itself 
def iter_all_strings(): 
    size = 1 
    while True: 
     for s in itertools.product(ascii_lowercase, repeat=size): 
      yield "".join(s) 
     size +=1 

Il codice seguente consente di generare stringhe, ad esempio per generare etichette univoche.

# define the generator handler 
gen = iter_all_strings() 
def label_gen(): 
    for s in gen: 
     return s 

# call it whenever needed 
print label_gen() 
print label_gen() 
print label_gen() 
Problemi correlati