È possibile utilizzare itertools.product per questo. Restituisce tutte le possibili combinazioni.
Ad esempio
for a1, a2, b in itertools.product(optionlist1,optionlist1,optionlist2):
do_something(a1,a2,b)
Ciò produrrà "doppi" come [a1, a1, b2] e [a2, a3, b2], [a3, a2, b2]. Puoi sistemarlo con un filtro. Di seguito le impedisce eventuali doppie *:
for a1,a2,b in itertools.ifilter(lambda x: x[0]<x[1], itertools.product(optionlist1,optionlist1,optionlist2)):
do_something(a1,a2,b)
(*) Questo presuppone che le opzioni hanno qualche ordinamento naturale che sarà il caso di tutti i valori di base.
shang 's answer è anche molto buono. Ho scritto un codice per confrontarli:
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
e il risultato è:
0.189330005646
0.428138256073
Quindi il metodo generatore è più veloce. Tuttavia, la velocità non è tutto. Personalmente trovo il mio codice 'più pulito', ma la scelta è tua!
(Btw, danno entrambi i fronti identici, quindi entrambi sono ugualmente corrette.)
scusa, ma sono un po 'incerto su cosa stai cercando di fare. Hai bisogno di una tabella di tutte le possibili combinazioni di elementi dell'elemento, dove nessuno proviene dalla stessa lista? Qualsiasi nodo dovrebbe mai essere None? – fncomp
Immagino di essere stato lento a capire cosa volevi. – fncomp