2010-05-28 39 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