在python中,循环如何在列表分配中工作?

在python中,循环如何在列表分配中工作?,python,list,loops,Python,List,Loops,考虑以下命令: 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

考虑以下命令:

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
之后的循环如何成为等效的外部循环。我想了解命令的格式,以便了解它的工作原理

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

_l=[]
for i in range(len(states_batch)):
  for s in states_batch[i]:
    if rewards_batch[i]>=reward_threshold:
      _l.append(s)
事实并非如此。列表理解的读取方式与普通嵌套循环相同。首先在
范围(len(states\u batch))
上循环,然后在此循环内,检查
如果rewards\u batch[i]>=rewards\u 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]
]

唯一的区别是理解中的循环是按顺序写的(一个接一个),但在扩展版本中,它们一个嵌套在另一个中,理解中的最后一个循环嵌套得最深。

一开始可能看起来是向后的,但是让列表中的最后一个循环成为内部循环是如此
i
在范围内。试着以另一种方式对它们进行排序,
i
的使用将在其声明之前出现。如果您仔细想想,它们(由@ForceBru声明的循环的正确版本)的顺序是相同的:outerloop->if->innerloop,唯一改变的是结果的位置