为了账号安全,请及时绑定邮箱和手机立即绑定

理解地图功能

理解地图功能

开满天机 2019-07-09 16:48:12
理解地图功能map(function, iterable, ...)将函数应用于可迭代的每一项,并返回结果列表。如果传递了额外的可迭代参数,函数必须接受这些参数,并行地应用于所有可迭代项。如果一个可迭代项比另一个可迭代项短,则假定扩展时不包含任何项。如果函数是None,则假定为标识函数;如果存在多个参数,map()返回一个由元组成的列表,其中包含来自所有可迭代项的对应项(一种转置操作)。可迭代参数可以是序列或任何可迭代的对象;结果总是一个列表。这在制造笛卡尔产品中扮演什么角色?content = map(tuple, array)在任何地方放置一个元组有什么效果?我还注意到,如果没有map函数,输出是abc有了它,它a, b, c.我想充分理解这个功能。参考定义也很难理解。太多花哨的绒毛了。
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-07-09
?
慕少森

TA贡献2019条经验 获得超9个赞

map与笛卡儿积一点关系都没有,尽管我想一个精通函数式编程的人可能会想出一些不可能理解的方法来生成一个用map.

map在Python 3中,这相当于:

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

Python 2的唯一不同之处在于它将构建一个完整的结果列表,以便立即返回所有结果,而不是yield英。

虽然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循环(或处理函数,如sum它只需要一个可迭代的,而不需要一个序列)。但也要再次注意,通常倾向于使用列表理解:

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


查看完整回答
反对 回复 2019-07-09
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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)

正元map等效于将可迭代的输入压缩到一起,然后对中间压缩列表的每个元素应用转换函数。它是不笛卡尔产品:


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实际上,当可迭代性大小不同时,行为实际上略有不同-正如其文档中所指出的,它扩展了可访问性以包含None.


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 302 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信