将生成器表达式嵌套在python函数调用的参数列表中

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'.我想知道是否有人想办法避免这种错误,除了"不要那样做".

Sil*_*ost 6

嵌套列表理解不是更合适吗?

>>> 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)

  • 为什么要把它粘在一条线上?为什么不只是嵌套for循环?这将更加清晰,不需要构建任何中间列表. (2认同)