了解地图function
map(function, iterable, ...)
将函数应用于每个迭代项并返回结果列表。 如果传递了额外的迭代参数,函数必须采用多个参数并应用于并行所有迭代中的项目。
如果一个迭代器比另一个迭代器短,则假定用None项扩展。
如果函数是None
,则假定身份函数; 如果有多个参数,则map()
返回一个由包含所有迭代项(一种转置操作)中相应项的元组构成的列表。
可迭代的参数可能是一个序列或任何可迭代的对象; 结果总是一个列表。
这在制造笛卡尔产品中起什么作用?
content = map(tuple, array)
在那里放置一个元组有什么作用? 我也注意到没有map函数的输出是abc
,并且是a, b, c
。
我想完全理解这个function。 参考定义也很难理解。 花式绒毛太多了。
map
不是特别pythonic。 我会build议使用列表parsing:
map(f, iterable)
基本上相当于:
[f(x) for x in iterable]
map
自己不能做笛卡尔乘积,因为它的输出列表的长度总是和它的input列表相同。 你可以通过一个列表理解来轻松地做一个笛卡儿积:
[(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))
map
并不涉及笛卡尔积,尽pipe我想象一个熟悉函数式编程的人可能会想出一些不可能的方法来生成一个使用map
。
Python 3中的map
等同于:
def map(func, iterable): for i in iterable: yield func(i)
而Python 2中的唯一区别是它将build立一个完整的结果列表来一次返回而不是yield
。
尽pipePython约定通常会优先使用列表parsing(或生成器expression式)来实现与map
调用相同的结果,特别是如果您使用lambdaexpression式作为第一个参数:
[func(i) for i in iterable]
作为你在问题的注释中所要求的一个例子 – “把一个string转换成一个数组”,你可能想要一个元组或一个列表(它们的行为有点像来自其他语言的数组) –
>>> 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
的使用是,如果你从一个string列表开始,而不是一个单一的string – map
可以单独判断所有的string:
>>> 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
循环(或者只需要可迭代的sum
等处理函数,而不是一个序列)。 但是也要再次注意,列表理解通常是首选:
>>> [list(b) for b in a] [['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]
map
通过对源的每个元素应用一个函数来创build一个新的列表:
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
相当于将input迭代器压缩在一起,然后在该中间压缩列表的每个元素上应用变换函数。 这不是笛卡尔的产品:
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
。
简化一下,你可以想象map()
做这样的事情:
def mymap(func, lst): result = [] for e in lst: result.append(func(e)) return result
正如你所看到的,它需要一个函数和一个列表,并返回一个新的列表,其结果是将函数应用到input列表中的每个元素。 我说“简化了一下”,因为实际上map()
可以处理多个迭代:
如果传递了额外的迭代参数,函数必须采用多个参数并应用于并行所有迭代中的项目。 如果一个迭代器比另一个迭代器短,则假定用None项扩展。
对于问题的第二部分:在制造笛卡尔产品中,这起到了什么作用? 那么map()
就可以用来生成这样一个列表的笛卡尔乘积:
lst = [1, 2, 3, 4, 5] from operator import add reduce(add, map(lambda i: map(lambda j: (i, j), lst), lst))
…但是说实话,使用product()
是解决问题的一种更简单自然的方法:
from itertools import product list(product(lst, lst))
无论如何,结果是如上所定义的lst
的笛卡尔积:
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]
希望这可以帮助那些刚刚接触编程和python的人:
map()
函数用于将相同的过程应用于iterable data structure
中的每个item
,如lists
, generators
, strings
和其他内容。
让我们来看一个例子: map()
可以iterate
list
中的每个item
,并将function
应用于每个item
,而不是return
(返回) new list
。
认为你有一个function
,需要一个数字( integer
),加1到该数字并返回它。
def add_one(num): new_num = num + 1 return num
你也有一个数字list
( integers
)
my_list = [1,3,6,7,8,10]
如果要increment
list
中的每个数字( integer
),可以执行以下操作:
map(add_one, my_list)
注意:至lessmap()
需要两个arguments
。 首先是一个function
名,其次是一个list
。
上面例子的结果, map()
会让你回到这个:
[2, 4, 7, 8, 9, 11]
让我们看看map()
可以做的其他一些很酷的事情。 map()
可以接受多个iterables
( lists, strings, etc
),并将每个list
的element
(我使用list作为示例)传递给一个function
作为argument
。
我们有以下列表:
list_one = [1, 2, 3, 4, 5] list_two = [11, 12, 13, 14, 15] list_three = [21, 22, 23, 24, 25]
map()
可以让你成为一个new list
,在特定的index
(位置)上添加元素。
现在记住map()
,需要一个function
。
def add_from_three_lists(num1, num2, num3): total_num = num1 + num2 + num3 return total_num
现在让我们使用map()
函数
map(add_from_three_lists, list_one, List_two, list_three)
你会得到:
[33, 36, 39, 42, 45]
记得:
在Python2 map()
,将根据最长的list
iterate
( iterate
lists
元素),并将NoneType
传递给较短lists
的function
,所以你的function
应该查找NoneType
并处理它们,否则你会得到errors
。 在python 3中map()
只会按照最短的list
。 另外,在Python 3中, map()
返回一个迭代器,而不是一个列表。