三级列表理解

2024-09-29 17:24:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 代码inimportfor顺序absminheater
2条回答

使用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())

表达式有两个不同的生成器表达式。一个在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) for x in iterable)中的函数调用f(x)引用x)。你知道吗

相关问题 更多 >

    热门问题