我们可以在列表理解中使用嵌套for循环的背后原因是什么 [英] What is the under the hood reason that we can use nested for loops in list comprehensions

查看:0
本文介绍了我们可以在列表理解中使用嵌套for循环的背后原因是什么的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在研究列表理解,但几天来有些事情阻止了我。

简单的列表理解形式为

[expression for item in iterable]

等效的for循环为

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

如果我是对的,那么列表理解通常所做的就是迭代遍历可迭代对象,计算每次迭代的表达式,然后将其附加到列表中。

for循环中应该发生的任何事情都写在liscomp的开头。

我们可以认为,在listcomp中,Python只允许一个表达式,并且for循环的套件只允许有if子句或嵌套的for循环。

引用我正在读的一本书的话说

因为列表理解产生列表,也就是可迭代的,并且列表理解的语法需要可迭代的,所以嵌套列表理解是可能的。这相当于嵌套了for … in个循环。

这混淆了我的理解。

这说明了拥有像[s+z for s in iterable_1 for z in iterable_2]这样的listcomp的原因吗?

有人能解释一下这是什么意思吗?

推荐答案

您的第一个翻译应该是

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

您的示例[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)
祝贺你,你发现了.单子星!它们本质上就是您所描述的,泛化嵌套循环

嵌套循环只产生简单的结果流。当展平时,嵌套的列表也会转换为普通的元素流。这就是相似之处。懒惰appendyield非常相似。

每个Monad类型由它如何实现flatMap函数的版本定义,该函数是一个映射,后跟生成的嵌套结构的展平。在每个嵌套级别上展平嵌套结构允许展平任意深度的嵌套:

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

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

看到区别了吗?什么都没有!任何执行上述操作的类型都是单子类型。喜欢列表。

循环也是如此,它可以嵌套到任意深度--两个、三个,不管是什么,都无关紧要。整个结构仍在一个接一个地产生结果,而这些是最里面的循环一个接一个地产生的结果。

那个是我们可以在列表理解中使用嵌套for循环的背后原因。或者,用一种花哨的方式说同样的话,这是因为列表理解就像一元操作链(可以这样翻译)。

这篇关于我们可以在列表理解中使用嵌套for循环的背后原因是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆