在 Python 中将列表理解转换为 For 循环

Posted

技术标签:

【中文标题】在 Python 中将列表理解转换为 For 循环【英文标题】:Converting List Comprehensions to For Loops in Python 【发布时间】:2015-12-02 10:47:26 【问题描述】:

我了解列表推导的重要性,但不了解它们的内部工作原理,因此无法用更简单的术语(例如 for 循环)来理解它们。例如,如何将其更改为 for 循环:

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

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

【问题讨论】:

【参考方案1】:

这只是表达list 的一种更短的方式。

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

相当于:

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

一旦你习惯了语法,它就会成为创建lists(和其他可迭代对象)的一种简洁方式。

【讨论】:

【参考方案2】:

问题:

如何将其更改为 for 循环?

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

答案:

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

【讨论】:

【参考方案3】:

假设外部迭代是针对索引的,这段代码可以有效地重写为:

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

在这里,您在 outer_list 内的列表中进行迭代。因此,第一次迭代会将outer_list 中的第一个列表添加到li,然后附加第二个列表,依此类推。

【讨论】:

【参考方案4】:

您的问题似乎暗示这个 sn-p 已经在 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官方教程here所示。

为了完整起见,我已经包含了嵌套列表解析示例,但对明智的人说一句:使用嵌套列表解析通常会使代码更难理解,而不是更多。仅仅因为你可以并不意味着你应该。

【讨论】:

以上是关于在 Python 中将列表理解转换为 For 循环的主要内容,如果未能解决你的问题,请参考以下文章

如何将此列表理解转换为 for 循环,但我不能 [重复]

使用for循环遍历python中的列表

在python列表中将数字转换为成绩

从浮点字符串到 Int 的 Python 类型转换在创建列表时无法在 for 循环中工作

在R中将嵌套的for循环转换为并行

是否可以将此循环转换为python中的列表理解