python - 3 级列表理解

标签 python list-comprehension

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

相关文章:

python - 如何在数据 block 集群上运行非 Spark 代码?

Python - 用字典中的条目替换字符串中的单词

python - 根据排名对字典项目求和

python - 如何使用seaborn或matplotlib在python中绘制分类特征与分类值

python - 分配列表理解、差异

python - 列表理解中的动态自引用条件

python - 如何访问嵌套的理解列表

python - 使用 GTK 更新 GUI 中数据的函数建议

python - 如何在 django-filter 中包含列表理解结果?

python - 名称未在具有多个循环的列表理解中定义