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

标签 python generator list-comprehension

有时我喜欢使用以下习惯用法将列表组合在一起:

>>> 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'。我想知道除了“不要那样做”之外,是否有人想过避免这种错误的方法。

最佳答案

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

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

关于python - 在 python 函数调用的参数列表中嵌套生成器表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1620957/

相关文章:

python - 将列表与不同大小的子列表组合

python - Python 中的 If 语句和设置变量

python - 将整个 Excel 文件导出为 CSV

python - shiboken 类型系统不继承类

ruby - 如何创建 thor::group 生成器作为 my_command 的参数

python - 如何将 unicode 类型与 python 中的字符串进行比较?

python - 我什么时候可以安全地使用 float 来做数学?

Python 异步生成器不是异步的

python - Python中是否有一个库函数可以将生成器函数转换为返回列表的函数?

list - 如何获取列表中非零元素的索引列表?