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 -- https://mail.python.org/mailman/listinfo/python-list