2010-05-28 41 views
4

我有一个获取名为row的数组的python函数。将可能包含None的数组更改为在python中包含“”的数组

通常行包含的东西,如:

["Hello","goodbye","green"] 

和我一起打印:

print "\t".join(row) 

不幸的是,有时它包含:

["Hello",None,"green"] 

生成该错误:

TypeError: sequence item 2: expected string or Unicode, NoneType found 

是否有一种简单的方法可以用“”替换任何“无”元素?

回答

11

您可以使用conditional expression

>>> l = ["Hello", None, "green"] 
>>> [(x if x is not None else '') for x in l] 
['Hello', '', 'green'] 

稍短的方法是:

>>> [x or '' for x in l] 

但要注意的是第二种方法也改变0和其他一些对象为空字符串。

+0

漂亮光滑; python何时获得“if”作为运营商? – vy32 2010-05-28 20:35:39

+1

@ vy32,蟒蛇2.5:http://en.wikipedia.org/wiki/Ternary_operation#Python – Stephen 2010-05-28 20:38:11

+2

由于结果只是要通过'str.join'消耗,它可以使一个很大的意义使用发电机表达而不是列表理解。考虑在答案的第2行使用圆括号而不是方括号。 – Wesley 2010-05-28 21:08:44

0

您还可以使用内置的过滤器功能:

>>> l = ["Hello", None, "green"] 
>>> filter(None, l) 
['Hello', 'green'] 
+2

这可能不是一个好的解决方案这个特殊的问题,这个问题提到制表符'\ t'被用作分隔符,直接删除列表中的一个元素可能导致一个较少的制表符被发射 – Wesley 2010-05-28 21:06:17

+0

这不会做我想做的,因为输出列表的元素数量不同于输入列表 – vy32 2010-05-29 07:25:58

1

您可以用生成器表达式来代替数组:

print "\t".join(fld or "" for fld in row) 

这将取代一切视为空字符串as False(None,False,0,0.0,'...)。

+0

我不知道Python让你在这一点上使用“或”。整齐。谢谢。 – vy32 2010-05-30 17:01:50