涉及条件的python map函数(+ lambda)(如果)

时间:2015-06-11 21:35:43

标签: python lambda

我很好奇是否可以通过列表理解来执行map()功能。

对于ex,请将此列表comp:

example_list = [x*2 for x in range(5) if x*2/6. != 1]
显然,这给了我[0,2,4,8]。

如何使用map()功能制作等效词?这样做会给我一个语法错误。

example_map = map(lambda x:x*2 if x*2/6. != 1, range(5))

试图更好地理解如何使用此功能。

3 个答案:

答案 0 :(得分:7)

您必须将map包裹在列表周围filter周围:

example_map = map(lambda x: x*2, filter(lambda x: x*2/6. != 1, range(5)))

答案 1 :(得分:4)

或者,您可以filter map而不是map filter。{/ p>

example_map = filter(lambda x: x/6. != 1, map(lambda x: x*2, range(5)))

请记住,您现在正在过滤结果而不是原始结果(即lambda x: x/6. != 1而不是lambda x: x*2/6. != 1,因为x已经从地图加倍了

如果你真的想要,你可以种类将它与条件表达式一起抛出

example_map = map(lambda x: x*2 if x*2/6. != 1 else None, range(5))

但是它会让你[0, 2, 4, None, 8]filter(None, example_map)会删除None并按预期离开[0, 2, 4, 8]

答案 2 :(得分:3)

除了其他答案之外,一些解决方案表明语法错误的原因是obj()函数:

  

将函数应用于iterable的每个项目并返回结果列表。

因此结果与iterable的长度相同。如果使用map语句,则还需要指定if

else

作为替代方法,您可以使用>>> map(lambda x:x*2 if x*2/6. != 1 else None, range(5)) [0, 2, 4, None, 8] 过滤您的iterable:

itertools.ifilter

请注意,由于您不需要过滤列表的结果,并且您只想将其传递给>>> from itertools import ifilter >>> map(lambda x:x*2,ifilter(lambda x: x*2/6. != 1,range(5))) [0, 2, 4, 8] ,因此使用map会更有效率,因为它会返回生成器并且你可以为长列表保存很多内存;)(它在python 2和python 3中都是ifilter返回生成器)