Bạn có thể sử dụng itertools.product cho việc này. Nó trả về tất cả các kết hợp có thể.
Ví dụ
for a1, a2, b in itertools.product(optionlist1,optionlist1,optionlist2):
do_something(a1,a2,b)
này sẽ tạo ra "đôi" như [a1, a1, b2] và [a2, a3, b2], [a3, a2, b2]. Bạn có thể sửa lỗi này bằng bộ lọc. Các trường hợp sau ngăn chặn mọi đôi *:
for a1,a2,b in itertools.ifilter(lambda x: x[0]<x[1], itertools.product(optionlist1,optionlist1,optionlist2)):
do_something(a1,a2,b)
(*) Điều này giả định rằng các tùy chọn có một số trường hợp tự nhiên.
shang 's answer cũng rất tốt. Tôi đã viết một số mã để so sánh chúng:
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
Và kết quả là:
0.189330005646
0.428138256073
Vì vậy, các phương pháp phát nhanh. Tuy nhiên, tốc độ không phải là tất cả. Cá nhân tôi tìm thấy mã của tôi 'sạch hơn', nhưng sự lựa chọn là của bạn!
(Btw, họ cung cấp cho cả hai tội giống hệt nhau, vì vậy cả hai đều như nhau đúng.)
xin lỗi, nhưng tôi không hiểu rõ những gì bạn đang cố gắng làm. Bạn có cần một bảng của tất cả các kết hợp có thể có của các yếu tố các yếu tố, mà không ai là từ cùng một danh sách? Nên bất kỳ nút nào không bao giờ là Không? – fncomp
Tôi đoán tôi đã chậm để tìm ra những gì bạn muốn. – fncomp