Ale*_*try 1 python list-comprehension generator
我喜欢使用以下习惯用法将列表组合在一起,有时候:
>>> 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')]
Run Code Online (Sandbox Code Playgroud)
(我知道有更简单的方法来获得这个特定的结果,但是当你想要迭代列表列表中的元素或类似的东西时,它会派上用场.当你使用生成器表达式时,麻烦就是这个变得容易出错.例如
>>> 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')]
Run Code Online (Sandbox Code Playgroud)
这里发生的是内部生成器表达式作为参数传递itertools.chain,所以在它们被评估时,外部生成器表达式已经完成,并且n固定在它的最终值,'b'.我想知道是否有人想办法避免这种错误,除了"不要那样做".
嵌套列表理解不是更合适吗?
>>> tt = (('a', [1,2]),('b',[3,4]))
>>> [(s, i) for i, l in tt for s in l]
[(1, 'a'), (2, 'a'), (3, 'b'), (4, 'b')]
Run Code Online (Sandbox Code Playgroud)