2013-05-02 14 views
6

Moim celem jest wygenerowanie wszystkich możliwych łańcuchów (liter i cyfr) o długości x oraz aktywowanie bloku kodu dla każdego z nich. (jak iterator) Jedynym problemem jest to, że te w itertools nie robią kopii litery w tym samym ciągu. Na przykład:Jak wygenerować wszystkie możliwe ciągi w python?

Otrzymuję "ABC" "BAC" "CAB" itp. Zamiast "AAA".

Wszelkie sugestie?

Odpowiedz

21

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

Należy pamiętać, że tworząc listę zawierającą wszystkie kombinacje jest bardzo nieefektywne dla dłuższych ciągów - iteracyjne nad nimi zamiast:

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

Aby uzyskać wszystkie znaki i numery używać string.uppercase + string.lowercase + string.digits.

+1

Python 3 zmieniono tak, aby wbudowana 'mapa' zwróciła teraz iterator. Druga sugestia użycia 'itertools.imap' nie jest konieczna, chyba że jesteś wersją pytona <3.0. – ngoue

+2

Pytanie jest otagowane [tag: python-2.7] ... – ThiefMaster

+0

Masz rację, sir! – ngoue

6

Zastosowanie itertools.product() jeśli chcesz litery powtarzać:

>>> 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() i itertools.permutations() nie są poprawne narzędzia do pracy.

Powiązane problemy