带有嵌套range()函数的Python代码段

带有嵌套range()函数的Python代码段,python,range,Python,Range,我试图理解以下python代码片段: lst = [[c for c in range(r)] for r in range(3)] #line1 for x in lst: #line2 for y in x: #line3 if y < 2: #line4

我试图理解以下python代码片段:

lst = [[c for c in range(r)] for r in range(3)] #line1
for x in lst:                                   #line2
    for y in x:                                 #line3
        if y < 2:                               #line4
            print('*', end='')                  #line5

第2行和第3行是如何一起工作的?提前谢谢你的回答。欢迎提出任何想法

在嵌套列表理解中,r以值0开始,因此内部列表的计算结果为
[c代表范围(0)中的c]
,即[]。当r为1时,其计算结果为
[c表示范围(1)中的c]
,即[0]。当c为2时,您有
[c代表范围(2)中的c]
,即[0,1]。当这些在外部列表中生成时,它们将作为列表的列表元素返回。因此,在
lst
中有一个列表

for循环然后在第2行中的每个列表上迭代。第3行然后遍历每个列表中的整数元素

lst = [[c for c in range(r)] for r in range(3)]
这是一个嵌套列表

但这里可以简化,因为我们不需要列表列表,只需要
range
对象列表,这样我们就可以对它们进行迭代。所以

lst = [range(r) for r in range(3)]
更简单

既然如此,为什么还要创建一个列表呢?只需删除它,并使用一个经典的循环

for r in range(3):
    for y in range(r):
        if y < 2:
            print('*', end='')
范围(3)内r的
:
对于范围(r)中的y:
如果y<2:
打印('*',结束='')

代码片段创建了一个列表列表,其中大小(以及项目的实际值)取决于第一级列表中的索引

该代码段与

result = []
for k in range(3):
    result.append([])
    for v in range(k):
        result[k].append(v)

print(result)
=>>>
[[], [0], [0, 1]]

第一行相当于

lst=[list(range(r))表示范围(3)中的r]
这是一个列表理解,它生成一个列表,其中包含多达
r-1
的列表
list(range(r))
生成
[0,1,2,…,r-1]
,因为r变量在列表理解中获取值0,1和2,这意味着它将生成一个包含列表[](r=0),[0],(r=1)和[0,1](r=2)的列表

第2行遍历
lst
的列表,第3行遍历每个列表的值。因此,这两行联合迭代
lst

Re中的所有数字

“带'lst'的第一行最令人困惑。”:

无论您在哪里看到
[…for…]
都有所谓的“列表理解”。这是一种基于元素的单行循环描述建立列表的方法。例如:

list1 = [letter for letter in 'abcd'] 

产生相同的列表
list1
list2

在您的例子中,有两组
[]
和两组
for
语句,因此在列表理解中有一个列表理解:因此结果不仅仅是一个列表,而是一个嵌套列表

“第2行和第3行如何协同工作?”

第2行遍历列表中的所有项目
lst

但这些项中的每一项也是一个列表,因为您有一个嵌套列表。因此,第3行遍历该内部列表中的每个项目。

只是一个嵌套的列表理解,可以更简单地编写
[范围(r)表示范围(3)中的r)]
这是一个(第一行)。尝试添加打印以更好地理解正在发生的事情,或者使用它不是真实的代码示例。这只是一道考试题,所以我试图更好地理解它。
r
设置为0、1和2。对于每个
r
值,它会制作一个长度为
r
的列表,
范围(r)
的值。最好在交互式会话中测试这一点。试试
[c代表范围(3)]
,等等,非常感谢!我明白了:)太棒了!很高兴听到这个消息!
list1 = [letter for letter in 'abcd'] 
list2 = []
for letter in 'abcd':
    list2.append(letter)