我喜欢用下面的语句用于组合名单在一起,有时:嵌套生成器表达式在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')]
(我知道有更容易的方式来获得这个特定的结果,但说到就派上用场了,当你想遍历的列表,或类似的东西的清单列出的元素。麻烦的是,当你使用生成器表达式,这成为容易出错。如
>>> 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'
。我想知道是否有人想过避免这种错误的方法,超越“不这样做”。
谢谢,产品功能看起来应该更安全,并导致更清晰的表达。 – 2009-10-25 15:36:36