在 python 中解决列表理解

Solving list comprehensions in python

所以一直在python学习列表推导,不明白嵌套的逻辑 列表理解在 python 中有效。考虑以下代码片段:

####TRADITIONAL EXAMPLE-1###
L = []
for i in range(5):
   for j in range(4):
      L.append(j)

#output of l-> [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]

####TRADITIONAL EXAMPLE-2###
K = []
for i in range(5):
   for j in range(4):
      K.append(i)

#output of k -> [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4]

好的,这一切都说得通,但是当我想使用列表理解重新创建这些时,逻辑对我来说没有意义。现在考虑这些例子:

###LIST COMPREHENSION EXAMPLE-3####
L1 = [j for j in range(4) for i in range(5)]
#Output of L1 -> [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]

###LIST COMPREHENSION EXAMPLE-4####
K1 = [i for j in range(4) for i in range(5)]
#Output of K1 -> [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

###LIST COMPREHENSION EXAMPLE-5####
Q = [[j for j in range(4)] for i in range(5)]
#Output of Q -> [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

###LIST COMPREHENSION EXAMPLE-6####
Q1 = [[i for j in range(4)] for i in range(5)]
#output of Q1 -> [[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]

所以我不知道为什么,但我希望无论使用传统方式还是列表理解方式,输出 L 和 L1(示例 1 和 3)都是相同的,K 和 K1(示例2 和 4) 特别是当我比较 Q 和 Q1 的输出时(例如 5 和 6)。就像比较 Q1 和 K1(示例 4 和 6)一样,它们几乎遵循相同的语法,但输出却大不相同。

我希望我能够根据这些列表理解中的每一个与传统方法相比的输出来澄清我自己的困惑。 我尝试在线搜索并遵循教程,但他们只是陈述示例,并没有解释其背后的工作原理或逻辑。我只是不想在不知道输出结果背后的原因的情况下搞砸输出。 感谢您的帮助:)

So I don't know why but I expect the output L and L1 (Examples 1 and 3) to be the same irrespective of using the traditional way or list comprehension way

你没有以正确的方式使用列表理解。您的内部和外部循环在您的示例中交换为 L1.

L1 = [j for i in range(5) for j in range(4)]

输出:

[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]

请参阅 this 答案以了解有关定义具有两个或更多 for 循环的列表理解的更多信息。

The best way to remember this is that the order of for loop inside the list comprehension is based on the order in which they appear in traditional loop approach. Outer most loop comes first, and then the inner loops subsequently.

K 和 K1 也一样:

K1 = [i for i in range(5) for j in range(4)]

输出:

[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4]

especially when I compare the output of Q and Q1 (Eg 5 & 6)

但是,当您像 Q 中那样使用列表理解时,您在这些示例中没有嵌套 for 循环。它被称为嵌套列表理解。有关嵌套循环理解的信息,请参阅 this