2009-12-23 24 views
17

tengo dos listas como:permutaciones de dos listas en Python

list1 = ['square','circle','triangle'] 
list2 = ['red','green'] 

¿Cómo puedo crear todas las permutaciones de estas listas, así:

[ 
    'squarered', 'squaregreen', 
    'redsquare', 'greensquare', 
    'circlered', 'circlegreen', 
    'redcircle', 'greencircle', 
    'trianglered', 'trianglegreen', 
    'redtriangle', 'greentriangle' 
] 

¿Puedo usar itertools para esto?

+2

Mucha gente parece estar perdiendo el requisito de permutaciones en ambos pedidos. (Por ejemplo, 'squarered' y 'redsquare'.) Tal vez deberías hacer esto más explícito. –

+0

Guau, definitivamente me perdí esa parte. Actualicé mi solución para arreglar esto. –

Respuesta

22
>>> import itertools 
>>> map(''.join, itertools.chain(itertools.product(list1, list2), itertools.product(list2, list1))) 
['squarered', 'squaregreen', 'circlered', 
'circlegreen', 'trianglered', 'trianglegreen', 
'redsquare', 'redcircle', 'redtriangle', 'greensquare', 
'greencircle', 'greentriangle'] 
8

¿Qué tal

[x + y for x in list1 for y in list2] + [y + x for x in list1 for y in list2] 

interacción Ejemplo IPython:

In [3]: list1 = ['square', 'circle', 'triangle'] 

In [4]: list2 = ['red', 'green'] 

In [5]: [x + y for x in list1 for y in list2] + [y + x for x in list1 for y in list2] 
Out[5]: 
['squarered', 
'squaregreen', 
'circlered', 
'circlegreen', 
'trianglered', 
'trianglegreen', 
'redsquare', 
'greensquare', 
'redcircle', 
'greencircle', 
'redtriangle', 
'greentriangle'] 
44

desea que el método itertools.product, que le dará la Cartesian product de ambas listas.

>>> import itertools 
>>> a = ['foo', 'bar', 'baz'] 
>>> b = ['x', 'y', 'z', 'w'] 

>>> for r in itertools.product(a, b): print r[0] + r[1] 
foox 
fooy 
fooz 
foow 
barx 
bary 
barz 
barw 
bazx 
bazy 
bazz 
bazw 

Su ejemplo pide el producto bidireccional (es decir, desea 'xfoo', así como 'foox'). Para conseguir eso, acaba de hacer otro producto y la cadena de los resultados:

>>> for r in itertools.chain(itertools.product(a, b), itertools.product(b, a)): 
... print r[0] + r[1] 
+2

OP quiere el producto en ambos pedidos, esta solución no está completa. –

+0

Solucionado ahora; no lo entendí como un requisito. –

1

Usted puede, en cualquier caso hacer algo como:

perms = [] 
for shape in list1: 
    for color in list2: 
    perms.append(shape+color) 
7

Creo que lo que busca es el producto de dos listas, no las permutaciones:

#!/usr/bin/env python 
import itertools 
list1=['square','circle','triangle'] 
list2=['red','green'] 
for shape,color in itertools.product(list1,list2): 
    print(shape+color) 

rendimientos

squarered 
squaregreen 
circlered 
circlegreen 
trianglered 
trianglegreen 

Si desea tanto squarered y redsquare, entonces se podría hacer algo como esto:

for pair in itertools.product(list1,list2): 
    for a,b in itertools.permutations(pair,2): 
     print(a+b) 

o, para convertirlo en una lista:

l=[a+b for pair in itertools.product(list1,list2) 
    for a,b in itertools.permutations(pair,2)] 
print(l) 

rendimientos

['squarered', 'redsquare', 'squaregreen', 'greensquare', 'circlered', 'redcircle', 'circlegreen', 'greencircle', 'trianglered', 'redtriangle', 'trianglegreen', 'greentriangle']