2011-10-01 51 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