代码之家  ›  专栏  ›  技术社区  ›  Ahmad

python中的列表赋值中循环是如何工作的?

  •  -1
  • Ahmad  · 技术社区  · 4 年前

    考虑以下命令:

    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 在第一个命令中,它变成了等效的外循环。我想了解命令的格式,以便了解它的工作原理!

    1 回复  |  直到 4 年前
        1
  •  3
  •   ForceBru    4 年前

    我发现这相当于以下循环:

    事实并非如此。列表推导式的读取方式与普通嵌套循环相同。首先,你绕过去 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]
    ]
    

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