了解map函数

2024-03-28 08:58:41 发布

您现在位置:Python中文网/ 问答频道 /正文

map(function, iterable, ...)

对iterable的每个项应用函数并返回结果列表。如果传递了其他可iterable参数,则函数必须接受该多个参数,并并行应用于所有可iterable中的项。

如果一个iterable比另一个iterable短,则假定该iterable扩展时没有任何项。

如果函数是None,则假定为identity函数;如果有多个参数,map()返回一个由元组组成的列表,其中包含来自所有iterable的相应项(一种转置操作)。

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

这在制造笛卡尔产品中扮演什么角色?

content = map(tuple, array)

把元组放在里面有什么效果?我还注意到,没有map函数的输出是abc,有了它,输出是a, b, c

我想完全理解这个函数。参考定义也很难理解。太花哨了。


Tags: 对象函数none角色map列表参数产品
3条回答

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元map相当于将输入iterable压缩到一起,然后对中间压缩列表的每个元素应用转换函数。它不是笛卡尔积:

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

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

Python 3中的map等价于:

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

Python 2的唯一区别是它将建立一个完整的结果列表,以便一次返回所有结果,而不是yield

尽管Python约定通常倾向于使用列表理解(或生成器表达式)来获得与调用map相同的结果,特别是当您使用lambda表达式作为第一个参数时:

[func(i) for i in iterable]

作为您在“将字符串转换为数组”问题的注释中所要求的示例,按“array”可能需要元组或列表(它们的行为都有点像其他语言的数组)

 >>> 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中,如果您想做任何事情,而不是将其馈送到一个for循环(或者一个只需要iterable而不是sequence的处理函数,如sum),则需要list调用。但也要再次注意,列表理解通常是首选的:

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

map不是特别的Python。我建议改为使用列表理解:

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))

相关问题 更多 >