所以我正在尝试这样做。
a = []
map(lambda x: a.append(x),(i for i in range(1,5)))
我知道map需要一个函数但是为什么它不会附加到列表中呢?或者追加不是功能?
但是,打印a
结果a
仍为空
现在有趣的是这件作品
a = []
[a.append(i) for i in range(5)]
print(a)
不是他们基本上“说”同样的事情吗?
这几乎就好像列表理解成为某种混合列表理解函数的东西
那为什么lambda和map方法不起作用?
答案 0 :(得分:6)
我假设你使用的是Python 3.x,你的map()代码不起作用的实际原因是因为在Python 3.x中,map()返回一个生成器对象,除非你迭代生成器对象通过map()返回,不调用lambda函数。尝试做列表(地图(...)),你应该看到一个填充。
话虽这么说,你所做的事情没有多大意义,你可以使用 -
a = list(range(5))
答案 1 :(得分:5)
append()
会返回None
,因此将其与map
函数结合使用是没有意义的。一个简单的for
循环就足够了:
a = []
for i in range(5):
a.append(i)
print a
或者,如果你想使用list comprehensions / map function;
a = range(5) # Python 2.x
a = list(range(5)) # Python 3.x
a = [i for i in range(5)]
a = map(lambda i: i, range(5)) # Python 2.x
a = list(map(lambda i: i, range(5))) # Python 3.x
[a.append(i) for i in range(5)]
上面的代码也会附加,但它也会创建一个None
值列表,其大小为range(5)
,这完全是浪费内存。
>>> a = []
>>> b = [a.append(i) for i in range(5)]
>>> print a
[0, 1, 2, 3, 4]
>>> print b
[None, None, None, None, None]
答案 2 :(得分:1)
函数map和filter的第一个参数是为序列中的每个元素(list,tuple等)调用的函数引用,作为第二个参数提供,并且此调用的结果用于创建结果列表< / p>
函数reduce作为第一个参数,作为第二个参数提供的序列中前2个elems调用的函数引用,结果与另一个调用中的第三个elem一起使用,然后结果与第四个元素一起使用, 等等。单个值导致结束。
>>> map(lambda e: e+10, [i for i in range(5)])
[10, 11, 12, 13, 14]
>>> filter(lambda e: e%2, [i for i in range(5)])
[1, 3]
>>> reduce(lambda e1, e2: e1+e2, [i for i in range(5)])
10
解释:
答案 3 :(得分:0)
此map
不起作用,因为append()
方法返回None
而不是列表:
>>> a = []
>>> type(a.append(1))
<class 'NoneType'>
要保持其功能正常,为什么不使用reduce
?
>>> from functools import reduce
>>> reduce(lambda p, x: p+[x], (i for i in range(5)), [])
[0, 1, 2, 3, 4]