有时,我喜欢使用以下习语将列表组合在一起:
>>> 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')]
(我知道有更简单的方法可以获得这个特定的结果,但是当你想要迭代列表列表中的元素时,它会派上用场,或者类似的东西。问题是,当你使用生成器表达式时,这个变得容易出错。例如
>>> 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')]
这里发生的是内部生成器表达式作为参数传递给itertools.chain
,因此在评估它们时,外部生成器表达式已完成,并n
固定为其最终值'b'
. 我想知道除了“不要那样做”之外,是否有人想过避免这种错误的方法。