这三个深层列表理解如何工作?具体来说,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)
答案 0 :(得分:2)
您的表达式具有两个不同的生成器表达式。一个在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 houses)
是外部生成器理解,而min(abs(house-heater) for i in ... for heater in ...)
是内部生成器。
内部生成器表达式可以从外部生成器表达式中引用迭代器变量house
(就像f(x)
中的函数调用(f(x) for x in iterable)
引用了x
一样)。
答案 1 :(得分:1)
使用for
循环获得奖励积分。
import bisect
houses, heaters = [1,2,3,90, 4],[1,4]
def loop1():
for house in houses:
def loop2():
for i in [bisect.bisect(heaters, house)]:
for heater in heaters[i-(i>0):i+1]:
yield abs(house - heater)
yield min(loop2())
max(loop1())