2011-10-01 19 views
0

的元素我有一個列表[1, 2, 3, -100, 2, -100]。 我需要用"ERROR"替換-100,以及其他人的相應字符串。更換符合與Python列表特殊情況下的功能性的方式

我可以像這樣的代碼。

resList = [] 
for val in list: 
    if val == -100: 
     resList.append("ERROR") 
    else: 
     resList.append("%d" % val) 

我該如何在功能上做同樣的事情。

我試過映射。

resList = map(lambda w: if w == -100: "ERROR" else:("%d" % val), list) 

但是它不能編譯,因爲它有語法錯誤。 他們有什麼問題?

+0

閱讀關於馬克·拜爾斯答案的評論,不管你選擇哪種解決方案;他們解釋你的語法錯誤。 – agf

回答

2

這一個不工作:

resList = map(lambda w: if w == -100: "ERROR" else:("%d" % val), list) 

,因爲你不能有一個lambda表達式內部的塊失敗。

我更喜歡list comprehension方法:

resList = ['ERROR' if item == -100 else item for item in yourlist] 

這應該不會產生任何錯誤。如果您遇到錯誤,那是因爲您的程序中有其他錯誤。或者縮進是錯誤的。發佈您獲得的具體錯誤消息。

另外,我建議你不要使用名稱list爲局部變量,因爲它隱藏具有相同名稱的內置。

+1

並且使用lambda映射,等同於:map(lambda w:「Error」if w == -100 else w,yourlist),但我認爲列表理解更具可讀性。 – Mark

+1

如果你願意,你可以在'lambda'裏面有一個'... if ... else ...'塊。不使用map的真正原因是因爲'map'非常醜陋,帶有不必要的函數調用。 – JBernardo

0

此代碼將做到這一點:

list = [1, 2, 3, -100, 2, -100] 
resList = ['ERROR' if x == -100 else str(x) for x in list ] 
0

這是一些怪異的代碼,但它的工作原理:

resList = ["%s%s" % ("ERROR" * (val == -100), ("%d" % val) * (val != -100)) for val in list] 

生產:

['1', '2', '3', 'ERROR', '2', 'ERROR'] 
1

這個工程:

["ERROR" if -100 == val else str(val) for val in list] 
1

如果您正確使用python三元運算符並且「w」lambda參數保持一致,則該映射將起作用。

map(lambda w: "ERROR" if w == -100 else ("%d" % w), list) 
+0

但這對於不必要的函數調用來說仍然很難看。此外,這不是Pythonic,而是%d「%w」 – JBernardo