2009-12-23 21 views
17

Ho due liste come:permutazioni di due liste in Python

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

Come posso creare tutte le permutazioni di queste liste, come questo:

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

Posso usare itertools per questo?

+2

A molte persone sembra mancare il requisito delle permutazioni in entrambi gli ordini. (Ad es., "Squarered" e "redsquare".) Forse dovresti renderlo più esplicito. –

+0

Wow, sicuramente mi sono perso quella parte. Aggiornato la mia soluzione per risolvere questo problema. –

risposta

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

Come su

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

interazione Esempio 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

si desidera che il metodo di itertools.product, che vi darà la Cartesian product di entrambe le liste.

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

Il vostro esempio richiede il prodotto bidirezionale (cioè, si vuole 'Xprog' così come 'foox'). Per ottenere questo, basta fare un altro prodotto e la catena dei risultati:

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

L'OP vuole il prodotto in entrambi gli ordini, questa soluzione non è completa. –

+0

Risolto ora; non l'ho capito come un requisito. –

1

È possibile in ogni caso fare qualcosa di simile:

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

penso che quello che stai cercando è il prodotto di due liste, non le permutazioni:

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

rendimenti

squarered 
squaregreen 
circlered 
circlegreen 
trianglered 
trianglegreen 

Se vuoi sia squarered e redsquare, allora si potrebbe fare qualcosa di simile:

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

o, per farne una lista:

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

rendimenti

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