2011-11-13 3 views
18

¿Por qué itertools.permutations() devuelve una lista de caracteres o dígitos para cada permutación, en lugar de simplemente devolver una cadena?Python Itertools.Permutations()

Por ejemplo:

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

¿Por qué no lo devuelva esto?

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

Respuesta

35

itertools.permutations() simplemente funciona de esta manera. Toma un iterable arbitrario como argumento, y siempre devuelve un iterador que produce tuplas. No (y no debería) cadenas de casos especiales. Para obtener una lista de cadenas, siempre puede unirse a las tuplas ti mismo:

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

¿Por qué usa el mapa sobre esto cuando no es una lista de comp, gen-expr u otro método? –

+0

Creo que 'map (" ". Join, itertools.permutations ('1234'))' es suficiente. Agregar la lista() no hace la diferencia. –

+0

@BillCheng En Python 2, el resultado de 'map()' ya es una lista, eso es cierto, pero esta pregunta fue sobre Python 3. En la mayoría de los casos, debería poder hacer con el objeto generador devuelto por 'map() 'en Python 3, pero para una prueba más fácil agregué la conversión explícita a una lista. –

3

no lo han intentado, pero lo más probable debería funcionar

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

Perumatation se puede hacer para cuerdas y lista también, a continuación es el ejemplo ..

x = [1,2,3] 

si necesita hacer la permutación en la lista anterior

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