Python:更清晰的列表理解

Python:更清晰的列表理解,python,list-comprehension,Python,List Comprehension,有没有更简洁的方法来写这句话: for w in [w for w in words if w != '']: 我想循环浏览一本字典单词,但只浏览那些!=''的单词。谢谢 这里不需要listcomp。只要写下: for w in words: if w != '': # ... 假设您正在寻找钥匙,为什么不试试: [w for w in words if w] 过滤器(lambda w:w!='',单词)或过滤器(无,单词) 这是一个建议,它可能不是解决您问题的最佳

有没有更简洁的方法来写这句话:

for w in [w for w in words if w != '']:

我想循环浏览一本字典
单词
,但只浏览那些
!=''的单词。谢谢

这里不需要listcomp。只要写下:

for w in words:
    if w != '':
        # ...

假设您正在寻找钥匙,为什么不试试:

[w for w in words if w]
过滤器(lambda w:w!='',单词)
过滤器(无,单词)


这是一个建议,它可能不是解决您问题的最佳解决方案。

测试元素不等于
不会过滤掉空白元素。如果这就是您想要的,那么您可能需要使用
str.isspace
(或正则表达式)

如果您使用列表理解,您将制作列表的额外副本作为中间对象。可能没什么大不了的,但是生成器不会使用额外的内存

我会这样做,用发电机:

for word in (w for w in words if not w.isspace()):
    # do stuff

外部for循环的主体是做什么的

如果是函数调用,您可能只需执行以下操作:


[f(w)表示w,换句话说,如果w!=']

我认为您的解决方案是次优的。您在列表
words
上迭代了两次-一次是在列表理解中创建非空术语,另一次是在循环中进行处理。如果您使用这样的genexp会更好

for w in (x for x in words if x): process(w)

这样,genexp将懒洋洋地返回一个非空列表。

@Daniel Goldberg,他说,我认为“for”是用于迭代的,而OP这样做太过分了,@dan04+1,这是正确的方式……如果你不想有另一个缩进级别,如果w==,你可以一直使用
:continue
如果不是w:continue
,这是我经常看到的东西。@Goldberg:listcomp比循环更受欢迎。附加到列表中,而不是一般的循环。“过滤器(P,S)几乎总是写得更清楚,如[x代表x,如果P(x)]”-Guido van Rossum。@Nou我偏爱功能性的东西。同时,圭多真的不喜欢他们。他们有自己的位置,但可能不是因为OP问题。你的第一个代码片段是一个语法错误(我想你的意思是
!=
-
不是
是另一回事)。使用
filter
在某种程度上并不比使用列表理解(这是我们从Haskell那里偷来的主意!)更有效,并且对lambdas使用
filter
map
在我看来是非常愚蠢的。你说的“功能性东西”是什么意思?你是说过滤器的名称吗?它在语义上与列表理解(它本身是从纯函数式语言借用来的)有何不同?@Nou python manual称之为函数式工具,因此称之为函数式东西。有时我使用它们是因为它们在某些情况下使代码更干净。从语义上讲,这可能没有什么不同。
对于w,在words:if x:process(w)
中,我觉得更简单、更短、更清晰。下面的一位评论员指出,“非空白的单词”与
!=“”
。如果需要,请使用
isspace
方法。对不起,我说错了,我不是指空格(已编辑)。