这三个深度列表理解是如何工作的?具体来说,house
如何位于 bisect.bisect(heaters, house)
的范围内?我对生成器的理解是,它们按照从左到右的顺序执行,并且该代码位于创建 house 的左侧。奖励:如果您可以使用 for 循环重写它。
import bisect
houses, heaters = [1,2,3,90, 4],[1,4]
max(min(abs(house - heater)
for i in [bisect.bisect(heaters, house)]
for heater in heaters[i-(i>0):i+1])
for house in houses)
最佳答案
您的表达式有两个不同的生成器表达式。其中一个位于 max
内部,并有一个 for
子句。另一个嵌套在第一个子句的 min
调用中,并且有两个 for
子句。当前代码的缩进显示了与其缩进的关系,但它可以更明确:
max(
min(
abs(house - heater)
for i in [bisect.bisect(heaters, house)]
for heater in heaters[i-(i>0):i+1]
)
for house in houses
)
在这里您可以看到嵌套结构:max(... for house in housing)
是外部生成器理解,而 min(abs(house-heater) for i in . .. 对于...中的加热器)
是内部的。
内部生成器表达式可以从外部生成器表达式引用迭代器变量house
(就像(f( x) for x in iterable)
指的是 x
)。
关于python - 3 级列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51469717/