2015-03-30 9 views
6

Chciałbym zrobić listę alfabetyczną dla aplikacji podobnej do arkusza Excela.Jak utworzyć ciągły alfabetyczny python listy (od a-z, aa, ab, ac itp.)

Użytkownik wprowadziłby liczbę komórek i chciałbym wygenerować listę. Na przykład użytkownik potrzebuje 54 komórek. Następnie wygenerowałabym:

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

mogę wygenerować listę z [ref]

from string import ascii_lowercase 
L = list(ascii_lowercase) 

Jak mogę stitch to razem? Podobne pytanie dla PHP zostało zadane here. Czy ktoś ma odpowiednik Pythona?

Odpowiedz

13

Użyj 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 

Wynik:

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

Ma to tę dodatkową zaletę, znacznie wykraczające poza kombinacji dwóch liter. Jeśli potrzebujesz milion ciągów, z przyjemnością dostarczysz trzy-, cztero- i pięcioliterowe ciągi.


Bonus styl wskazówka: jeśli nie podoba posiadające wyraźny break wewnątrz dolnej pętli, można użyć islice aby pętla rozwiązać na własną rękę:

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

Możesz użyć rozumienia listy.

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

To nie wydaje się dostać kombinacji jednej litery 'a', 'b', etc – Kevin

+0

@Kevin, dodałem pojedyncze litery 'a', 'b', ... –

+0

Ok, ale co jeśli użytkownik potrzebuje więcej niż 702 różnych ciągów? Będą musieli wyjść poza "zz" na "aaa". – Kevin

1

Po @Kevin ' s odpowiedź:

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 

Poniższy kod umożliwia generowanie ciągów, które mogą być używane na przykład do generowania unikatowych etykiet.

# 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() 
Powiązane problemy