将嵌套循环和条件转换为列表推导

pis*_*tal 1 python list

有没有办法让列表理解这个条件集.

clamp_sel = list()
for i in range(0, len(clamp_normalized)):
        for j in range(0, len(clamp_normalized[i])):
                if clamp_normalized[i][j][0] < int(max_min_band[index_selec]):
                        clamp_sel.append(int(clamp_normalized[i][j][0]))
Run Code Online (Sandbox Code Playgroud)

如果它是单维列表,我可以用这种方式设置条件.

norm_sel = [i for i in normalize_data if i[0] > max_min_band[index_selec]]
Run Code Online (Sandbox Code Playgroud)

谢谢

Bas*_*els 5

这应该直接转化为列表理解:

clamp_sel = [int(clamp_normalized[i][j][0])
    for i in range(0, len(clamp_normalized))
    for j in range(0, len(clamp_normalized[i]))
    if clamp_normalized[i][j][0] < int(max_min_band[index_selec])]
Run Code Online (Sandbox Code Playgroud)

一般规则是(参见手册)您应该按照与使用一系列嵌套 for 循环和 if 语句完全相同的顺序编写列表理解。您唯一更改的是将 final 替换为xx.append(yy)just yyat the front of the list comprehension。另请注意,这本质上是一个很长的表达式,您可以写在很长的一行上。由于包含[],您可以将此表达式划分为多行,并带有任意缩进。

如果列表理解比原始理解更Pythonic,那就是品味问题。在这种情况下,嵌套很简单,所以我个人会选择列表理解。如果它变得更复杂,请坚持使用 for 循环。

正如 thefourtheye 所示,这个例子可以通过range()直接迭代替换你的列表来进一步简化。


the*_*eye 5

如果clamp_normalized是列表列表,则可以不使用迭代range,除非您需要索引.

clamp_sel  = [j[0]
                  for i in clamp_normalized
                  for j in i
                  if j[0] < int(max_min_band[index_selec])]
Run Code Online (Sandbox Code Playgroud)