Generator question
Pierre Reinbold
preinbold at gmx.net
Thu Mar 14 08:46:18 EDT 2019
Le 14/03/19 à 10:45, Peter Otten a écrit :
> Pierre Reinbold wrote:
>
>> Wow, thank you Ian for this very detailed answer, and thank you for taking
>> the time for that! Much appreciated!
>>
>> If I get this right, I have to somehow fix the value of a_list during the
>> loop, like when you use the classic default value argument trick with
>> lambdas (damn, I should have thought of that!). So if I "unfold" the
>> generator expression, using default values for both iterables, I get this
>> :
>>
>> def flat_gen_cat_prod(lists):
>> solutions = [[]]
>> for a_list in lists:
>> def new_solutions(l=a_list, s=solutions):
>> for part_sol in s:
>> for el in l:
>> yield part_sol+[el]
>> solutions = new_solutions()
>> return solutions
>>
>> With this I get the right behavior! Thanks again!
>>
>> Doest that mean that there is no possibility to use a generator expression
>> in this case ? (gen. exp. are sooo much more elegant :-))
>
> The obvious approach is to put the genexpr into a function:
>
> def prod(lists):
> solutions = [[]]
> def new_solutions(a_list):
> return (part_sol + [el] for part_sol in solutions for el in a_list)
>
> for a_list in lists:
> solutions = new_solutions(a_list)
> return solutions
>
> If you want to avoid the function you can take advantage of the fact that
> the outermost iterable is bound early:
>
> def prod(lists):
> solutions = [[]]
>
> for a_list in lists:
> solutions = (
> part_sol + [el]
> for solutions, a_list in [(solutions, a_list)]
> for part_sol in solutions for el in a_list
> )
> return solutions
>
>
Thank you Peter, very clever suggestions !
πr
More information about the Python-list
mailing list