【问题标题】:map,lambda and append.. why doesn't it work?map、lambda 和 append .. 为什么它不起作用?
【发布时间】:2015-08-02 05:33:05
【问题描述】:

所以我正在尝试这样做。

a = []
map(lambda x: a.append(x),(i for i in range(1,5))) 

我知道 map 需要一个函数,但是为什么它不附加到列表中呢?还是 append 不是一个函数? 但是打印a 结果到a 仍然是空的

现在一个有趣的事情是它有效

a = []

[a.append(i) for i in range(5)]
print(a)

他们基本上不是在“说”同样的话吗?

就好像列表理解变成了某种混合列表理解功能的东西

那么为什么 lambda 和 map 方法不起作用?

【问题讨论】:

  • 你到底在做什么?我运行了第一个示例,它填充了列表 a。它还返回另一个带有空值的列表,这是有道理的。
  • @MK。你确定什么?我正在闲置,列表a 为空你做了什么?
  • 这里实际上不需要 lambda; a.append已经是一个函数,可以调用将x添加到a
  • a 被填充 - 作为副作用,这通常是一个坏主意。列表理解的结果是 list of None - 因为 list.append 返回 None

标签: python python-3.x


【解决方案1】:

我假设您使用的是 Python 3.x,使用 map() 的代码不起作用的实际原因是因为在 Python 3.x 中, map() 返回一个生成器对象,除非您遍历生成器对象由 map() 返回,不调用 lambda 函数。尝试做 list(map(...)) ,你应该会看到一个被填满的。

话虽如此,你所做的没有多大意义,你可以使用-

a = list(range(5))

【讨论】:

  • 你去。这就是我现在正在寻找的东西,如果你把它列成一个清单,它就可以工作。是的,虽然。我试图测试我对 lambdas 的理解没有任何意义。这只是我真正想测试的概念。是的,就像其他人说的那样。这没有意义。但我想我现在对 lambdas 有了更多的了解.. 谢谢你
【解决方案2】:

append() 返回None,因此将其与map 函数结合使用是没有意义的。一个简单的for 循环就足够了:

a = []
for i in range(5):
    a.append(i)
print a

或者,如果您想使用列表推导/映射函数;

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]

【讨论】:

  • 或只是 a.extend(range(5))
  • @ozgur 是的,这个非常简单。这不是我想要一个填充列表,而是为什么不填充它。使用 lambda。因为 map 需要一个迭代器和一个函数并将所有这些迭代器运行到一个函数,所以不应该填充列表 a 吗?不管这样做是否有意义,都采用这种方法
  • @volcano 这与扩展列表无关,呵呵。我更困惑为什么它不起作用。当 map 接受一个函数和可迭代并将所有可迭代应用于该函数时。那么为什么没有填充呢?
  • @Zion,与 Python 2.7 不同,maprange 函数在 Python 3 中返回一个生成器对象,因此您必须使用 list() 强制评估它们。
  • @ozgur 我知道该死的懒惰评价!哈哈,但是是的。我仍在努力理解所有这些概念,因为我完全是个菜鸟。但是,是的,感谢您抽出宝贵的时间来回答和指导我。我真的很感激:D
【解决方案3】:

函数 map 和 filter 有一个函数引用作为第一个参数,该函数引用为作为第二个参数提供的序列(列表、元组等)中的每个元素调用,并且此调用的结果用于创建结果列表

函数reduce有一个函数引用作为第一个参数,该函数引用被作为第二个参数提供的序列中的前2个elem调用,并且结果与第三个elem一起在另一个调用中使用,然后结果与第四个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

解释:

  • map 示例:将列表 [0,1,2,3,4] 的每个元素添加 10
  • 过滤示例:只保留列表[0,1,2,3,4]中奇数的元素
  • reduce 示例:添加列表 [0,1,2,3,4] 的前 2 个元素,然后添加列表的结果和第三个元素,然后添加结果和第四个元素,依此类推。

【讨论】:

  • 你的过滤功能真的很酷。因为起初我是这样的。它不应该返回所有偶数值吗?但后来我记得过滤器返回 truthy 的东西和所有等于零的数字 % 2 不会被包括在内,因为零是 falsey 所以这很整洁
【解决方案4】:

这个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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2012-07-30
    • 2017-07-09
    • 2016-07-14
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多