【问题标题】:How do loops work in list assignments in python?循环如何在 python 的列表分配中工作?
【发布时间】:2020-06-06 18:18:34
【问题描述】:

考虑以下命令:

elite_states  = [s for i in range(len(states_batch)) 
                if rewards_batch[i]>=reward_threshold for s in states_batch[i]]

我发现相当于下面的循环:

_l=[]
for i in range(len(states_batch)):
  for s in states_batch[i]:
    if rewards_batch[i]>=reward_threshold:
      _l.append(s)

但是,我不明白第一个命令中s 之后的循环如何变成等效的外循环。我想了解命令的格式,以便了解它是如何工作的!

【问题讨论】:

  • 一开始可能看起来倒退了,但是将列表理解中的最后一个循环作为内部循环,所以i 在范围内。尝试以相反的方式对它们进行排序,i 的使用将在其声明之前。
  • 如果您考虑一下,它们 (@ForceBru 所述循环的正确版本) 的顺序相同:outerloop -> if -> innerloop,唯一的改变的是结果's'的位置

标签: python list loops


【解决方案1】:

我发现相当于下面的循环:

不是。列表推导式的读取方式与普通嵌套循环相同。首先循环range(len(states_batch)),然后,在这个循环内,检查if rewards_batch[i]>=reward_threshold,接下来,在这个条件内,运行最后一个循环。

所以“扩展”版本看起来像这样:

_l=[]
for i in range(len(states_batch)):
  if rewards_batch[i]>=reward_threshold:  # `if` and the inner `for` are switched
    for s in states_batch[i]:
      _l.append(s)

在代码中,这与推导极为相似:

_l = [
  s
  for i in range(len(states_batch))
  if rewards_batch[i]>=reward_threshold
  for s in states_batch[i]
]

唯一的区别是推导式中的循环是按顺序编写的(一个之后),但在扩展版本中,它们嵌套在一个内部中,最后一个理解中的循环嵌套最深。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2014-05-09
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多