Python 三级列表理解

Python 三级列表理解,python,list-comprehension,Python,List Comprehension,这三个深度列表理解是如何工作的?具体来说,house如何在bisect.bisect(加热器、房屋)的范围内?我对生成器的理解是,它们按从左到右的顺序执行,代码段位于创建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

这三个深度列表理解是如何工作的?具体来说,
house
如何在
bisect.bisect(加热器、房屋)
的范围内?我对生成器的理解是,它们按从左到右的顺序执行,代码段位于创建
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
内,一个
用于
子句。另一个嵌套在第一个内,在
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(…用于内部房屋)
是外部发电机,而
min(abs(房屋加热器)用于i in…用于内部加热器…
是内部发电机


内部生成器表达式可以引用外部生成器表达式中的迭代器变量
house
(就像
中的函数调用
f(x)
(f(x)表示iterable中的x)
引用
x

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

它们在同一个生成器表达式中是从左到右的,但是
for house in house
for i in[…]for heater in heaters[…]是两个不同的生成器表达式(注意第6行末尾的括号)。添加注释:[bisect]中的for i是单个整数eah上的for循环,这是一种非常隐蔽的方法,可以在生成器表达式中为局部变量赋值。它很有用,因为
i
在之后的主
for
子句中被多次使用。是的,它正在做一些我不知道如何做的事情,除了新的:=PEP.Evan,你能链接到你正在引用的吗?你可以只做
i=bisect.bisect(…)
而不是
for i
循环。
for
循环只在生成器表达式中需要,因为您无法执行其他赋值操作(至少在PEP 572为Python 3.8实现之前是这样)。@Blckknght对您的评论投了赞成票,因为这是一个重要的观点,但问题是理解可能如何工作,而不是如何完成,所以我把它放在里面,让它更容易看。是的,作业的常规循环工作得很好。我只是想提一提,因为避免常规赋值的唯一原因是因为不能在生成器表达式中进行赋值。