Python列表理解:使用"if"语句理解结果

spe*_*ane 6 python list-comprehension list

你能根据理解中的变换结果过滤列表理解吗?

例如,假设您要删除列表中的每个字符串,并删除只是空格的字符串.我可以轻松地做到以下几点:

filter(None, [x.strip() for x in str_list])
Run Code Online (Sandbox Code Playgroud)

但是这会在列表上重复两次.或者,您可以执行以下操作:

[x.strip() for x in str_list if x.strip()]
Run Code Online (Sandbox Code Playgroud)

但该实现执行strip两次.我也可以使用发电机:

for x in str_list:
   x = x.strip()
   if x:
      yield x
Run Code Online (Sandbox Code Playgroud)

但现在这是一堆代码行.有没有办法做上述(1)只迭代一次; (2)只进行一次转换; (3)在单一列表中理解?上面的例子是一个玩具示例,但我想用更长的列表和非平凡的变换来做这件事.

更新:我正在使用Python 2.7.X,并且更喜欢这方面的答案,但如果Python 3有一些新功能可以让它变得简单,我也很乐意了解它们.

Mad*_*ist 5

不要传递列表filter,传递生成器表达式,它只会迭代一次:

filter(None, (x.strip() for x in str_list))
Run Code Online (Sandbox Code Playgroud)

这与使用嵌套生成器完全相同

[y for y in (x.strip() for x in str_list) if y]
Run Code Online (Sandbox Code Playgroud)

这两种情况都依赖于生成器的惰性求值:str_list当创建相应的输出元素时,每个元素将被处理一次.不会制作中间名单.

对于像这样的小型一次性变换,理解方法很不错.即使是在转换后过滤的简单示例也在我看来推动了可读性的极限.对于任何非平凡的转换和过滤器序列,我建议使用for循环.