在python生成器中一行很多

时间:2018-07-29 06:15:25

标签: python list for-loop generator

我无法像这样在一个生成器中理解带有多个“ for”的代码,我搜索了Google却找不到任何答案:

print [j for i in [[1,2],[4,6]] for j in i ]
# will print [1, 2, 4, 6]

print [j for j in i for i in [[1,2],[4,6]] ]
# will print [4, 4, 6, 6]

有什么区别?

如何解释这样的代码?

4 个答案:

答案 0 :(得分:5)

希望这些扩展将帮助您推理代码。我认为这种方式更具可读性。我一次只打印一个元素,而不是整个列表。

print [j for i in [[1, 2], [4, 6]] for j in i]

等同于

for i in [[1, 2], [4, 6]]:
    for j in i:
        print j

结果i = [4, 6]

现在

print [j for j in i for i in [[1,2],[4,6]]]

等同于

for j in i: # Remember, i = [4, 6]
    for i in [[1, 2], [4, 6]]:
        print j

答案 1 :(得分:2)

第一个列表理解为

mat = [[1,2],[4,6]]
a = []
for i in mat:
    for j in i:
        a.append(j)
print(a)

第二个列表理解为

b = []
for j in i:
    for i in mat:
        b.append(j)
print(b)

答案 2 :(得分:2)

第二个生成器是错误的,但是在您的代码脚本中,第二个生成器在运行第一个生成器后将i[4, 6],因此第二个生成器将输出[4, 4, 6, 6] < / p>

答案 3 :(得分:1)

理解可以解释为循环的简写,循环的唯一声明是将元素添加到它们创建的列表中。您显示的语法是如何实现嵌套循环。

例如,您的第一个摘录[j for i in [[1,2],[4,6]] for j in i]可以重写为

result = []
for i in [[1,2],[4,6]]:
    for j in i:
        result.append(j)

请注意,理解过程中循环的顺序与扩展形式中的顺序相同。

您的第二个摘录[j for j in i for i in [[1,2],[4,6]]然后成为

result = []
for j in i:
    for i in [[1,2],[4,6]]:
        result.append(j)

如您所见,这将仅在第一个循环开始时以NameError失败,因为此时尚未定义i