当前位置: 首页 > 知识库问答 >
问题:

理解map函数

罗学林
2023-03-14
map(function, iterable, ...)

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

如果一个迭代比另一个迭代短,则假定它是用无项扩展的。

如果函数是,则假定身份函数;如果有多个参数,map()返回包含所有迭代中相应项的元组组成的列表(一种转置操作)。

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

这在制造笛卡尔积时扮演什么角色?

content = map(tuple, array)

把元组放在任何地方都有什么效果?我还注意到,没有map函数,输出是abc,有了它,输出是a、b、c

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

共有3个答案

邹修真
2023-03-14

map通过对源的每个元素应用函数来创建新列表:

xs = [1, 2, 3]

# all of those are equivalent — the output is [2, 4, 6]
# 1. map
ys = map(lambda x: x * 2, xs)
# 2. list comprehension
ys = [x * 2 for x in xs]
# 3. explicit loop
ys = []
for x in xs:
    ys.append(x * 2)

n-arymap等价于将输入迭代压缩在一起,然后对中间压缩列表的每个元素应用转换函数。这不是笛卡尔的产品:

xs = [1, 2, 3]
ys = [2, 4, 6]

def f(x, y):
    return (x * 2, y // 2)

# output: [(2, 1), (4, 2), (6, 3)]
# 1. map
zs = map(f, xs, ys)
# 2. list comp
zs = [f(x, y) for x, y in zip(xs, ys)]
# 3. explicit loop
zs = []
for x, y in zip(xs, ys):
    zs.append(f(x, y))

我在这里使用了zip,但是map当iterables大小不同时,行为实际上略有不同-正如其文档中所指出的,它将iterables扩展为包含None

姬奇思
2023-03-14

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

Python 3中的map等效于此:

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

Python2唯一的区别是它将建立一个完整的结果列表,一次返回所有结果,而不是yielding。

尽管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')

如果从字符串列表而不是单个字符串开始,则可以在此处使用mapmap可以单独列出所有字符串:

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

请注意,map(list,a)在Python2中是等效的,但是在Python3中,如果您不想将其送入for循环(或者只需要iterable而不需要序列的sum等处理函数),则需要调用list。但请再次注意,通常首选列表理解:

>>> [list(b) for b in a]
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]
干浩阔
2023-03-14

map并不特别像蟒蛇。我建议改为使用列表理解:

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))
 类似资料:
  • 问题内容: 将函数应用于每个iterable并返回结果列表。如果传递了其他可迭代的参数,则函数必须采用那么多参数,并且并行地将其应用于所有可迭代的项目。 如果一个可迭代项短于另一个可迭代项,则假定它扩展为None。 如果为,则假定为身份函数;如果有多个参数,则返回一个由元组组成的列表,其中包含所有可迭代对象中的对应项(一种转置操作)。 可迭代参数可以是序列或任何可迭代对象。结果总是一个列表。 这在

  • 在Spark中,Map通过函数传递源的每个元素,并形成新的分布式数据集。 Map函数示例 在此示例中,我们为每个元素添加一个常量值。要在Scala模式下打开Spark,请按照以下命令操作 - 使用并行化集合创建RDD。 现在,可以使用以下命令读取生成的结果。 应用map函数并传递执行所需的表达式。 现在,可以使用以下命令读取生成的结果。 在这里,得到了所需的输出。

  • 问题内容: 我正在尝试学习React,并且是Java的初学者。现在,我正在开发一个从Flickr的API提取数据的应用程序。问题是,当我尝试在Main.js组件中的props上使用map方法时,出现错误消息“ Uncaught TypeError:this.props.photos.map不是函数”。在此处在Stackoverflow上搜索后,我认为问题在于this.props是javascrip

  • 本文向大家介绍springmvc处理模型数据Map过程解析,包括了springmvc处理模型数据Map过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了springmvc处理模型数据Map过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 SpringmvcTest.java Index.jsp success.jsp 启动

  • 本文向大家介绍理解javascript回调函数,包括了理解javascript回调函数的使用技巧和注意事项,需要的朋友参考一下 把函数作为参数传入到另一个函数中。这个函数就是所谓的回调函数 经常遇到这样一种情况,某个项目的A层和B层是由不同的人员协同完成.A层负责功能funA,B层负责funcB。当B层要用到某个模块的数据,于是他对A层人员说,我需要你们提供满足某种需求的数据,你给我提供一个接口。