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有一些新功能可以让它变得简单,我也很乐意了解它们.
不要传递列表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循环.