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
方法。对不起,我说错了,我不是指空格(已编辑)。