【问题标题】:Trouble using map() in python to update an existing list在 python 中使用 map() 更新现有列表时遇到问题
【发布时间】:2018-05-12 14:06:39
【问题描述】:

为什么返回一个空列表:

def word_lengths(phrase):

    result = []
    map(lambda x: result.append(x) , phrase.split())
    return result

因为这会返回短语中每个单词的长度列表:

def word_lengths(phrase):

    return list(map(lambda x: len(x) , phrase.split()))

【问题讨论】:

  • 请提供示例输入(短语)以及预期输出与实际输出。
  • 请注意,lambda x: len(x) 只是表达len 的一种更复杂的方式,并且整个事情会更Python 地表示为列表理解:[len(word) for word in phrase.split()]
  • Python 3 map dictionary update method to a list of other dictionaries 的可能重复项(是关于 dict.update,而不是 list.append,但其他所有内容都相同)
  • 首先,在前一种情况下,您没有将 map 调用分配给任何内容。甚至使用result.append(x) 作为您的lambda 调用list(map(... 只会返回None 的列表,其中包含phrase.split() 中的尽可能多的元素

标签: python python-3.x functional-programming map-function


【解决方案1】:

在 Python 3 中,map 会生成一个生成器,该生成器会被延迟评估。

您需要对其进行迭代才能生效,例如通过在其上调用list 构造函数:

result = []
list(map(lambda x: result.append(x) , phrase.split()))
return result

这会像您预期的那样改变 result

请注意,同样可以通过更简单的方式实现:

return phrase.split()

【讨论】:

  • 直接返回phrase.split()更多更多的Pythonic。滥用map 产生副作用是对函数式编程习惯用法的深刻误解。 map(以及列表推导和生成器表达式)应该始终没有副作用,以避免在远处发生大量令人毛骨悚然的动作,从而难以推理代码。
  • 另外,旁注:对于 非常 极少数情况,使用 map 获得副作用是有意义的(通常使用 multiprocessing map 类似的函数并行化任务),强制它运行完成的最佳方法是将其包装在带有maxlen0collections.deque 构造函数中(经过优化,可以在不存储任何东西的情况下运行迭代器以耗尽),例如collection.deque(map(...), 0) 这将避免无目的地制作一个可能很大的临时 listNones。
  • 我很欣赏副作用的评论,并且该短语.split() 是一种更简单的方法。这是一个关于理解地图的python课程的项目问题,我只是想知道你是否可以在lambda中更新一个外部列表......纯粹是学术性的。
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2018-04-20
  • 2020-01-15
相关资源
最近更新 更多