Вы можете использовать itertools.product для этого. Он возвращает все возможные комбинации.
Например
for a1, a2, b in itertools.product(optionlist1,optionlist1,optionlist2):
do_something(a1,a2,b)
Это произведет "двойников", как [a1, a1, b2] и [a2, a3, b2], [a3, a2, b2]. Вы можете исправить это с помощью фильтра. Ниже предотвращает любые двойники *:
for a1,a2,b in itertools.ifilter(lambda x: x[0]<x[1], itertools.product(optionlist1,optionlist1,optionlist2)):
do_something(a1,a2,b)
(*) При этом предполагается, что варианты есть естественный порядок, который будет в случае со всеми примитивными значениями.
shanganswer также очень хорошо. Я написал код для их сравнения:
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
И результат:
0.189330005646
0.428138256073
Таким образом, метод генератора быстрее. Однако скорость - это еще не все. Лично я нахожу мой код «чище», но выбор за вами!
(Btw, они дают как идентичные счетчики, так как одинаково правильно.)
извините, но я немного не понимаю, что вы пытаетесь сделать. Вам нужна таблица всех возможных комбинаций элементов, где ни один из них не из одного списка? Должен ли какой-нибудь узел когда-либо быть Нет? – fncomp
Я предполагаю, что я медленно понял, что вы хотели. – fncomp