了解地图功能

新手上路,请多包涵

Python 2 文档说:

内置函数: map(function, iterable, ...)

将函数应用于可迭代的每个项目并返回结果列表。如果传递了额外的可迭代参数,则函数必须接受那么多参数并并行应用于所有可迭代的项目。

如果一个可迭代对象比另一个更短,则假定使用 None 项进行扩展。

如果函数是 None ,则假定恒等函数;如果有多个参数, map() 返回一个列表,该列表由包含来自所有可迭代对象的相应项目的元组组成(一种转置操作)。

可迭代参数可以是序列或任何可迭代对象;结果始终是一个列表。

这在制作笛卡尔积中起什么作用?

 content = map(tuple, array)

将元组放在其中有什么影响?我还注意到,如果没有 map 函数,输出是 abc 而有了它,它是 a, b, c

我想完全理解这个功能。参考定义也很难理解。太多花哨的绒毛。

原文由 Web Master 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 311
2 个回答

map 不是特别pythonic。我建议改用列表推导:

 map(f, iterable)

基本上相当于:

 [f(x) for x in iterable]

map 自己不能做笛卡尔积,因为它的输出列表的长度总是和它的输入列表一样。不过,您可以通过列表理解轻松地做笛卡尔积:

 [(a, b) for a in iterable_a for b in iterable_b]

语法有点混乱——基本上相当于:

 result = []
for a in iterable_a:
    for b in iterable_b:
        result.append((a, b))

原文由 dave 发布,翻译遵循 CC BY-SA 3.0 许可协议

map 根本与笛卡尔积无关,尽管我想精通函数式编程的人可能会想出一些无法理解的方法来生成一个使用 map

map 在 Python 3 中相当于:

 def map(func, iterable):
    for i in iterable:
        yield func(i)

Python 2 中的唯一区别是它会建立一个完整的结果列表并立即返回所有结果,而不是 yield ing。

尽管 Python 约定通常更喜欢列表理解(或生成器表达式)来实现与调用 map 相同的结果,特别是如果您使用 lambda 表达式作为第一个参数:

 [func(i) for i in iterable]

作为您在问题评论中要求的示例 - “将字符串转换为数组”,通过“数组”,您可能想要一个元组或一个列表(它们的行为有点像其他语言的数组) -

  >>> a = "hello, world"
 >>> list(a)
['h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd']
>>> tuple(a)
('h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd')

使用 map 如果您从字符串 列表 而不是单个字符串开始 - map 可以单独列出所有字符串:

 >>> a = ["foo", "bar", "baz"]
>>> list(map(list, a))
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]

请注意 map(list, a) 在 Python 2 中是等价的,但在 Python 3 中你需要 list 如果你想做任何事情而不是将它送入 for loop (或处理函数,如 sum 只需要一个可迭代的,而不是一个序列)。但还要再次注意,通常首选列表理解:

 >>> [list(b) for b in a]
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]

原文由 lvc 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏