在Python中将列表推导式转换为for循环

3

我知道列表推导式的重要性,但是不理解它们的内部工作原理,因此无法像使用for循环一样简单地理解它们。例如,我如何将这个列表推导式改为for循环:

li = [row[index] for row in outer_list]

在这个例子中,我有一个列表的列表,对于我的目的来说是一个矩阵,名为 outer_list,它是一个列表的列表。 index 值是外部迭代所在的列号,从0到某个数字n。上面的列表推导式返回矩阵中的 index 列,并将其分配给 li 作为列表。如何创建一个 for 循环以此方式创建一个列表?
4个回答

8

这只是一种更短的方式来表达一个列表

li = [row[index] for row in outer_list]

等同于:

li = []
for row in outer_list:
    li.append(row[index])

一旦您熟悉了语法,它就成为创建列表(和其他可迭代对象)的整洁方式。


0

问题:

我该如何将这个改为for循环?

li = [row[index] for row in outer_list]

答案:

li = []
for row in outer_list:
   li.append(row[index])

0
假设外部迭代是用于索引的,则此代码可以有效地重写为:
for row in outer_list:
    li.append(row[index])

在这里,您正在迭代outer_list中的列表。因此,第一次迭代将把outer_list中的第一个列表添加到li中,然后附加第二个列表,以此类推。


0

你的问题似乎暗示着这段代码已经在一个for循环中,就像这样:

outer_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for index in xrange(3):
    li = [row[index] for row in outer_list]
    print li

这将输出:

[1, 4, 7]
[2, 5, 8]
[3, 6, 9]

您可以通过在外部循环中嵌套一个内部循环,将其转换为仅使用传统的for循环:

outer_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for index in xrange(3):
    li = []                    # initial empty list
    for row in outer_list:     # our inner loop
        li.append(row[index])  # Build the list "li" iteratively
    print li

如果您将此嵌套列表视为矩阵,则所描述的实质上是取矩阵的转置。您也可以完全通过列表推导来完成这个操作:
outer_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

transpose = [[row[i] for row in outer_list] for i in range(len(outer_list[0]))]

print transpose

这将产生:

[[1, 4, 7],
[2, 5, 8],
[3, 6, 9]]

正如官方Python教程这里所示。

我包含了嵌套列表推导式的例子,以保证完整性,但是有个忠告:通常使用嵌套列表推导式会使代码更难理解,而不是更容易。仅仅因为你可以这样做,并不意味着你应该这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接