Puede utilizar itertools.product para esto. Devuelve todas las combinaciones posibles.
Por ejemplo
for a1, a2, b in itertools.product(optionlist1,optionlist1,optionlist2):
do_something(a1,a2,b)
Esto producirá "dobles" como [a1, a1, b2] y [A2, A3, B2], [a3, a2, b2]. Puedes arreglar esto con un filtro. A continuación se previene cualquier dobles *:
for a1,a2,b in itertools.ifilter(lambda x: x[0]<x[1], itertools.product(optionlist1,optionlist1,optionlist2)):
do_something(a1,a2,b)
(*) Esto asume que las opciones tienen algún ordenamiento natural que será el caso con todos los valores primitivos.
shang 's answer también es muy bueno. Escribí algo de código para compararlos:
from itertools import ifilter, product
import random
from timeit import repeat
def generator_way(list1, list2):
def combinations(list1, list2):
return ([opt1, opt2, opt3]
for i,opt1 in enumerate(list1)
for opt2 in list1[i+1:]
for opt3 in list2)
count = 0
for a1,a2,b in combinations(list1,list2):
count += 1
return count
def itertools_way(list1,list2):
count = 0
for a1,a2,b in ifilter(lambda x: x[0] < x[1], product(list1,list1,list2)):
count += 1
return count
list1 = range(0,100)
random.shuffle(list1)
list2 = range(0,100)
random.shuffle(list2)
print sum(repeat(lambda: generator_way(list1,list2),repeat = 10, number=1))/10
print sum(repeat(lambda: itertools_way(list1,list2),repeat = 10, number=1))/10
y el resultado es:
0.189330005646
0.428138256073
lo tanto, el método de generador es más rápido. Sin embargo, la velocidad no es todo. Personalmente encuentro mi código 'más limpio', ¡pero la elección es tuya!
(Por cierto, dan ambos casos idénticos, por lo que ambos son igualmente correctas.)
lo siento, pero no estoy muy claro sobre lo que estás tratando de hacer. ¿Necesita una tabla de todas las combinaciones posibles de elementos del elemento, donde ninguno es de la misma lista? ¿Debería algún nodo ser None? – fncomp
Supongo que tardé en descubrir lo que querías. – fncomp