带有嵌套range()函数的Python代码段
我试图理解以下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
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)