Для этого вы можете использовать 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)
(*) Это предполагает, что параметры имеют некоторое естественное упорядочение, которое будет иметь место со всеми примитивными значениями.
shang 's ответ тоже очень хорошо. Я написал код для их сравнения:
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
Так что генераторный метод быстрее. Однако скорость это еще не все. Лично я нахожу свой код «чище», но выбор за вами!
(Кстати, они дают оба одинаковых числа, поэтому оба одинаково верны.)