假设我有以下python列表:
my_list = [1, 2,'X', 'Y', 0]
假设我想将此列表的值复制到新列表中,如下所示:
None
复制到新列表中我可以使用lambda函数执行此操作,如下所示吗?如果是这样,怎么样?
new_list = map(lambda(x): something-here-but-what??, my_list)
答案 0 :(得分:1)
为什么不写一个能做你想做的事的函数并把它放在lambda中呢?我没有理由试图为一些应该超过一行的东西制作一个复杂的单行。
my_list = [1, 2,'X', 'Y', 0]
def replace(x):
if x == 'X':
return None
elif type(x) == int and x <= 9 and x >= 0:
return x
else:
raise ValueError('Bad value')
new_list = map(lambda(x): replace(x), my_list[:-2]) # Returns [1, 2, None]
new_list = map(lambda(x): replace(x), my_list) # Raises exception
答案 1 :(得分:1)
支持Brenden(非常正确)回答...
你实际上可以用Python三元表达式做一些奇怪的事情......但结果却让人无法忍受。考虑部分解决方案:
>>> new_list = map(lambda x: x if isinstance(x, int) and (0 <= x and x <= 9) else ValueError('Bad things happened'), [1, 2, 3, "blah"])
>>> list(new_list)
[1, 2, 3, ValueError('Bad things happened',)]
不仅可怕而且可能会混淆大多数Pythonistas(不仅仅是使用不寻常的结构,而是为什么你会使用这种结构吗?),我不知道什么在没有重新定义list()
工作方式的情况下,实际上提出异常。 (raise
仅在独立时才有效。)
所以现在我们有一个令人困惑的lambda,它有条件地允许成员进入新的地图构造或包含ValueError
对象。育。
更好地将这个整个想法抽象出一个功能,这个功能以一种非常简单的方式完成你想要的功能 - 并且让#34;漂亮的代码成为其中的一部分。人们将来通常需要阅读的内容如下:
new_list = valid_list_to_map(your_list)
答案 2 :(得分:1)
使用条件表达式。
a = list(map(lambda n: n if n in (0,1,2,3,4,5,6,7,8,9) else (None if n == 'X' else 1/0), my_list))
可以提出的其他例外:
在条件表达式中用{/ 1>替换1/0
{}[n] #KeyError
x #NameError
(_ for _ in ()).throw(Exception('Foo'))) #any kind of exception you want
int('x') #ValueError
答案 3 :(得分:0)
要引发异常,必须使用'try'和'except'语句,并且lambda表达式中不允许使用语句。在Lambda表达式中,您只能拥有表达式,因此无法在lambda函数中引发异常。