2013-05-02 19 views
6

Amacım, uzunluk x'in olası tüm dizelerini (Harfler ve sayılar) oluşturabilmek ve her biri için bir kod bloğunu etkinleştirebilmektir. (bir yineleyici gibi) Tek sorun, itertools içindeki harflerin aynı dizede harfi kopyalamamasıdır. Örneğin,Python'da olası tüm dizeler nasıl oluşturulur?

"AAA" yerine "ABC" "BAC" "CAB" vb.

herhangi bir öneriniz? Kullanım itertools.product()

cevap

21

: bütün kombinasyonlarını içeren bir liste oluşturarak uzun dizeleri için çok verimsiz olduğunu

>>> 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'] 

Not - yerine üzerlerinden yineleme:

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

tüm karakterleri almak ve sayıları string.uppercase + string.lowercase + string.digits kullanın.

>>> 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() ve itertools.permutations() işiniz için doğru araçlar değildir:

+1

Python 3 değişti, böylece "map" özelliği artık bir yineleyici döndürüyor. Pitonun <3.0 sürümüne sahip değilseniz, itertools.imap 'i kullanmanın ikinci önerisi gerekli değildir. – ngoue

+2

Soru etiketli [etiket: python-2.7] ... – ThiefMaster

+0

Doğru, efendim! – ngoue