【问题标题】:Understanding List Comprehensions in terms of Loops in Python [duplicate]根据 Python 中的循环理解列表理解 [重复]
【发布时间】:2018-06-24 12:03:36
【问题描述】:

这里是非常新的 Python 学习者 - 请温柔一点。 我在理解 Python 中列表推导的概念时遇到了一些问题,因此我试图将列表推导代码等同于 for 循环。

我遇到了一个问题,其中我有 2 个列表:一个是值列表,第二个是索引列表。工作是使用索引列表从值列表中提取这些列,以创建一个较短的列表。例如,如果列表是:

my_table = ['1', '2', '3', '4']
           ['5', '6', '7', '8']
           ['-2', '-3', '-4', '-5']

col_indices = [0, 2]

我们想要:

Output = ['1', '3']
         ['5', '7']
         ['-2', '-4']

所以我之前在 Stack Overflow 上看到过这篇文章,我知道用一个列表理解来做到这一点的方法如下:

answer = []
for row in my_table:
    reduced_row = [row[idx] for idx in col_indices] 
    answer.append(reduced_row)
return answer

说实话,我有点明白这一点,但并不完全明白。为了更好地理解,我尝试编写一些嵌套循环来获得相同的结果,但我意识到我目前的理解水平没有很好的方法来做到这一点。

最初我尝试了以下方法:

col_list = []
for row in my_table:
    for idx in col_indices:
        new = [row[idx]]
        col_list.append(new)    
return col_list

但我知道这是错误的,因为它只是将值附加到第一列。 简而言之,我知道列表理解是从这样的索引中提取列的更有效方法,但是这段代码是为我提供的,我不确定以我目前的理解水平我是否可以自己编写它。为了更好地解析列表理解的想法,我试图找出一种只能使用循环来完成的方法,但我还没有找到一种方法来做到这一点。有人可以帮我解决这个问题,希望我能更好地了解这段代码的工作原理吗?

【问题讨论】:

  • 您知道上面的代码返回了意外的缩进,后跟TypeError: list indices must be integers or slices, not tuple
  • 有一个将列表理解转换为 for 循环的答案。请注意,您可以使用嵌套列表理解来完成整个操作:[[row[i] for i in col_indices] for row in my_table]
  • 感谢您的链接,我为可能的重复道歉 - 我看到的大部分帖子都是关于如何使循环进入列表理解,我正在向后工作,所以它们并不是特别相关。 @juanpa.arrivillaga 我确实认为我在概念上理解你更紧凑的列表理解;谢谢你。现在似乎只是练习的问题,直到我能够认识到获得所需格式的细微差别。

标签: python list loops list-comprehension


【解决方案1】:

你需要在内部循环开始之前创建一个临时的list,然后填充它:

for row in my_table:
    new = []
    for idx in col_indices:
        new.append(row[idx])
    col_list.append(new)    

基本上,大多数列表推导式都可以转换为这种模式的循环。

【讨论】:

  • 谢谢@georgexsh,我能够通过调试器逐步完成此操作,这非常有帮助。我是从 MATLAB 过来的,但我仍在尝试不使用索引或 +=1 来创建新的单元格/行。感谢您的回答。
猜你喜欢
  • 2022-01-25
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 2023-03-11
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
相关资源
最近更新 更多