J'aime utiliser l'expression suivante pour combiner des listes ensemble, parfois:expressions du générateur nichant dans la liste des arguments pour un appel de fonction python
>>> list(itertools.chain(*[[(e, n) for e in l] for n, l in (('a', [1,2]),('b',[3,4]))]))
[(1, 'a'), (2, 'a'), (3, 'b'), (4, 'b')]
(je sais qu'il existe des moyens plus faciles à obtenir ce résultat particulier, mais il vient est très pratique lorsque vous voulez itérer sur les éléments dans les listes de listes de listes, ou quelque chose comme ça. Le problème est, lorsque vous utilisez des expressions du générateur, cela devient sujette aux erreurs. Par exemple,
>>> list(itertools.chain(*(((e, n) for e in l) for n, l in (('a', [1,2]),('b',[3,4])))))
[(1, 'b'), (2, 'b'), (3, 'b'), (4, 'b')]
Qu'est-ce qui se passe voici que le générateur interne expresse les ions sont passés comme arguments à itertools.chain
, donc au moment où ils sont évalués, l'expression du générateur externe est terminée, et n
est fixée à sa valeur finale, 'b'
. Je me demande si quelqu'un a pensé à des façons d'éviter ce genre d'erreur, au-delà de "ne fais pas ça".
Merci, la fonction produit semble devoir être plus sûre et conduire à des expressions plus claires. –