我们可以在列表理解中使用嵌套for循环的底层原因是什么?

问题描述 投票:1回答:1

我一直在研究列表理解,有件事让我停了好几天。

一个简单的列表理解有这样的形式

[expression for item in iterable]

相当于 for 循环是

li=[]
for item in iterable
    li.append(item)

如果我没看错的话,一般来说,列表理解的做法是对可迭代的对象进行迭代,对每次迭代的表达式进行评估,然后将其追加到列表中。

无论在 for 循环写在liscomp的开头。

我们可以认为,在一个listcomp中,Python只允许一个表达式和 for 襻的衣服只允许有一个。if 嵌套 for 循环。

引用我在看的一本书上的说法是

由于列表理解会产生列表,也就是可迭代,而且列表理解的语法需要一个可迭代,所以可以嵌套列表理解。这相当于有嵌套的 for … in 循环。

这让我的理解很混乱。

这是否说了有一个listcomp这样的原因?[s+z for s in iterable_1 for z in iterable_2]

谁能给我解释一下这说的是什么。

python list-comprehension
1个回答
1
投票

你的第一个翻译应该是

li=[]
for item in iterable: 
    li.append( expression(item) )

你的例子 [s+z for s in iterable_1 for z in iterable_2] 译为

li=[]
for s in iterable_1:
    for z in iterable_2:
        li.append(s+z)

恭喜你,你发现了......单片机!这基本上就是你所描述的。嵌套环.

嵌套循环只是产生一个普通的结果流。嵌套 列表扁平化,也变成了一个普通的元素流。这就是相似性。A 懒惰 append 差不多 yield.

每个单体类型都是由它如何实现的 其版本flatMap 函数,这是一个映射,然后是嵌套结构的扁平化。嵌套结构在每个嵌套层次上的扁平化,可以实现一个 任意 窝的深度要平整。

M [M (a)]  ==>  M (a)

M [M [M (a)]]  ==>   # flatten the outer two layers first:
                     M [M (a)]  ==>  M (a)
               OR:
               ==>  # flatten the inner two layers first:
                     M [M (a)]  ==>  M (a)

看到区别了吗?没有任何区别! 凡是能做到以上几点的类型,都是 "单体"。像列表一样。

循环也是如此,它可以被嵌套到一个任意的深度--两个,三个,不管是什么,这都不重要。

是我们可以使用嵌套的底层原因。for 列表理解中的循环--因为列表理解就像单项操作链一样(可以这样翻译)。

© www.soinside.com 2019 - 2024. All rights reserved.