2010-05-04 57 views
0

有没有写这个更清洁的方式:我要循环字典words的Python:清洁列表理解

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

,但只有单词!= ''。谢谢!

+0

“不是空白的词”,正如下面的评论者指出的那样,*与“!=”“'*不一样。如果这是您需要的,请使用'isspace'方法。 – 2010-05-04 04:58:38

+0

对不起,我错过了,我不是指空白(编辑)。 – ash 2010-05-04 08:26:56

回答

6

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

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

好的。值得一试。 – ash 2010-05-04 03:31:27

+3

除列表理解是迭代的pythonic方式.... – 2010-05-04 03:33:21

+1

@Daniel Goldberg,谁说,我认为'for'是用于迭代,并且由于OP正在做它是过度的,@ dan04 +1,那是正确的方法...... IMO – 2010-05-04 03:37:01

2

假设你的钥匙后,为什么不尝试:

[w for w in words if w] 
1

filter(lambda w: w != '', words)filter(None, words)

这是暗示,它可能不是你的问题的最佳解决方案。

+0

“过滤器(P,S)几乎总是被写得更清晰,如[如果P(x)]中的[x for S]” - Guido van Rossum。 – 2010-05-04 03:39:01

+0

@Nou我偏向于功能性的东西。同时guido真的不喜欢他们。他们有他们的位置,但可能不是OP问题 – Anycorn 2010-05-04 03:41:09

+0

你的第一个片段是一个SyntaxError(我认为你的意思是'!='-'not'是不同的)。使用'filter'并不是某种功能*比使用列表理解(我们从别的地方偷走了一个想法,除了Haskell!),对lambda使用'filter'和'map'对我来说似乎非常愚蠢。 – 2010-05-04 03:46:04

1

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

如果您使用列表理解,则会将列表的额外副本作为中介对象。可能不是什么大问题,但是一个生成器不会使用额外的内存。

我不喜欢这样,与发电机:

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

什么是外for循环的身体呢?

如果它是一个函数调用你可能只是做:

[f(w) for w in words if w != '']

1

我认为您的解决方案是次优。您正在遍历列表words两次 - 一次在列表理解中创建非空项并在循环中再次执行处理。如果你使用像这样的genexp会更好。

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

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

+2

'对于w而言:如果x:过程(w)'看起来更简单,更短,更清晰。 – 2010-05-04 03:49:22