我很好奇是否可以通过列表理解来执行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))
试图更好地理解如何使用此功能。
答案 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
返回生成器)