2013-10-13 29 views
1

是否有名单理解这个条件集的方式。转换嵌套的循环和条件列表理解

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])) 

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

norm_sel = [i for i in normalize_data if i[0] > max_min_band[index_selec]] 

感谢

回答

4

这应该直接转换成一个列表理解:

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])] 

一般的规则是(见manual),你应该写列表理解完全相同如同您对一系列嵌套for循环和if语句所做的那样。您更改的唯一一件事就是更换最后xx.append(yy)yy在列表理解的前面。另外请注意,这实际上是一个很长的表达式,你可以写在一个非常长的线上。因为包封[],可以划分此表达多行,与任意的缩进。

如果列表理解更多pythonic比原来是一个味道的问题。在这种情况下,嵌套是直接的,所以我会亲自去列表理解。如果它变得更复杂,坚持for循环。

由于thefourtheye显示,这个例子可以进一步用在你的名单直接迭代更换使用range()简化。

+0

看起来很复杂,但一个列表理解就更不用说了。 –

+0

@GamesBrainiac:它可以使用LAMDA – pistal

+0

@pistal我不这么认为得到改善。你做了很多循环,所以是的,没有太多。 –

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])]