2017-05-25 41 views
0

我想执行循环:展平嵌套与因变量

for i in list_a: 
    for j in list_b[i]: 
     print(i, j) 

是否有可能使用itertools办呢? 我要寻找类似:

for i, j in itertools.product(list_a, list_b[i]) 

我想这样做的速度和可读性。

+1

我不认为这是可能的,以任何方式平坦,提高速度或可读性。嵌套方法在我看来是做到这一点的最自然和最有效的方法。你可以把它写成一个列表理解或者生成器表​​达式,例如:'[call_some_function(i,j)in list_a for list_b [i]]',但是这仍然是一个嵌套for循环。 – jez

+0

好的,但最快的是什么,写一个列表理解并用一个函数迭代它,或者创建一个产生一些东西并遍历它的函数? – Y0da

+0

如果你想要一个列表,使用列表理解。如果你想要一个生成器,可以使用一个生成器表达式:'stuff =(call_some_function(i,j)for list_a for list_a for list_b [i])'然后你可以在不浪费内存的情况下迭代,对于东西:do_some_more_stuff(东西)' –

回答

1

itertools不会给你在大多数情况下的速度(但会给你稳定性和保存尽可能您的时间,所以用它),作为双方的可读性和速度 - 没有什么比列表理解:

your_list = [(i, j) for i in list_a for j in list_b[i]] 

然后你可以打印它,如果你愿意:)

+0

好的,谢谢,如果我想做一些比打印更复杂的事情,我想我必须创建一个函数并将它传递给列表(或生成器)? – Y0da

+1

是的,如果您需要收集该函数的响应,您可以在生成器中调用您的函数而不是创建元组。否则,发电机除了排成一行并且产生一个不需要的“列表”之外没有任何意义。 – zwer