2011-11-13 11 views
18

Dlaczego itertools.permutations() zwraca listę znaków lub cyfr dla każdej permutacji, zamiast tylko zwracać ciąg znaków?Python Itertools.Permutations()

Na przykład:

>>> print([x for x in itertools.permutations('1234')]) 
>>> [('1', '2', '3', '4'), ('1', '2', '4', '3'), ('1', '3', '2', '4') ... ] 

Dlaczego nie zwróci to?

>>> ['1234', '1243', '1324' ... ] 

Odpowiedz

35

itertools.permutations() po prostu działa w ten sposób. Potraktuje ona dowolnie iterowalną argumentację i zawsze zwraca iterator dający krotki. Nie ma (i nie powinien) ciągów znaków specjalnych. Aby uzyskać listę ciągów, zawsze można dołączyć do krotki siebie:

list(map("".join, itertools.permutations('1234'))) 
+4

Dlaczego używasz mapy zamiast tego, czy nie jest to comp, gen-expr czy inna metoda. –

+0

Myślę, że 'map (" ". Join, itertools.permutations ('1234'))' jest wystarczające. Dodanie listy() nie robi różnicy. –

+0

@BillCheng W Pythonie 2, wynik 'map()' już jest listą, to prawda, ale pytanie dotyczyło Pythona 3. W większości przypadków powinieneś być w stanie zrobić z obiektem generowanym zwróconym przez 'map() 'w Pythonie 3, ale dla łatwiejszego testowania dodałem wyraźną konwersję do listy. –

3

nie próbowałem, ale najprawdopodobniej powinien działać

comb = itertools.permutations("1234",4) 
for x in comb: 
    ''.join(x)  
1

Perumatation można zrobić na smyczki i liście również, poniżej jest przykład ..

x = [1,2,3] 

jeśli musisz zrobić permutację powyższej listy

print(list(itertools.permutations(x, 2))) 

# the above code will give the below.. 
# [(1,2),(1,3),(2,1)(2,3),(3,1),(3,2)]