3级列表理解

时间:2018-07-22 22:21:05

标签: python list-comprehension

这三个深层列表理解如何工作?具体来说,housebisect.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)

2 个答案:

答案 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())