我想将参数传递为a,b,c,d值的组合。
a = [1,2,3,4,5,6,7,8,9]
b = [5,6,7,8,9,10,11,12,13,14,15]
c = [1,2,3,4,6,12,18]
d = [1,2,3,4,6,12,18,24]
results = []这是我的玩法:
def calc(a,b,c,d):
....我要它运行calc(1,5,1,1)然后运行calc(1,5,1,2) . calc(1,5,1,24) calc(1,5,2,1) calc(1,5,2,24) calc(1,6,1,1) calc(1,6,18,24) calc(2,5,1,1) calc(2,5,1,24) ..。直到calc(9,15,18,24)
我希望将a、b、c和d的所有可能组合作为参数传递给函数。
我是通过使用嵌套循环实现的。
for i in a:
for j in b:
for k in c:
for l in d:
results.append(calc(i,j,k,l))但我认为这不是最好的解决办法
运行15分钟,因为我使用的数据集太大了
发布于 2021-03-07 20:17:00
如果需要计算所有内容,运行时就不会真正改变--但这将取决于您的calc函数以及您的输入中是否有重复(这将允许您使用动态编程和缓存查找您的函数)。
为了简化迭代,you can use itertools.product
输入可迭代的
笛卡儿积
大致相当于生成器表达式中嵌套的for-循环。例如,乘积(A,B)返回与((x,y)在A中表示y在B中)相同的结果。
因此,要迭代所有这些列表的乘积:
import itertools
for a_i, b_i, c_i, d_i in itertools.product(a, b, c, d):
calc(a_i, b_i, c_i, d_i)但是,请注意,这可能不是您在示例中提到的完全相同的迭代模式,但它仍然会迭代列表中的每一个可能的组合。
发布于 2021-03-07 20:15:30
要稍微缓和一下复杂性,可以使用itertools.product
itertools.product(*iterables, repeat=1)
输入迭代的笛卡儿积。
大致相当于生成器表达式中嵌套的for-循环。例如,product(A, B)返回与(x,y) for x in A for y in B)相同的内容。
import itertools
p = itertools.product(a, b, c, d)
for value_a, value_b, value_c, value_d in p:
result = calc(value_a, value_b, value_c, value_d)
print(result)https://stackoverflow.com/questions/66520928
复制相似问题