介绍
我们可以使用 Python 内置的函数 map()
将函数应用于 iterable 中的每个项目(如 列表或 字典)并返回一个新的迭代器以获取结果。
「map()」函数的语法如下:
1map(function, iterable, [iterable 2, iterable 3, ...])
代替使用 for
loop,map()
函数提供了将函数应用于 iterable 中的每一个项目的方式,因此它通常可以更有效,因为它只会一次应用一个项目的函数,而不是将项目复制成另一个 iterable。
在本教程中,我们将审查使用map()的三种不同的工作方式:使用lambda函数,使用用户定义函数,最后使用使用多个可迭代参数的内置函数。
使用 Lambda 函数
第一個論點為「map()」是一個函數,我們用它來應用於每個項目。Python 呼叫函數一次為每個項目,我們將它轉換為「map()」並返回地圖對象內的被操縱的項目。
具有 lambda 函数的 map()
语法如下:
1map(lambda item: item[] expression, iterable)
通过以下列表,我们可以实现一个lambda
函数,用一个表达式来应用于我们列表中的每个项目:
1numbers = [10, 15, 21, 33, 42, 55]
要将一个表达式应用于我们每个数字,我们可以使用map()
和lambda
:
1mapped_numbers = list(map(lambda x: x * 2 + 3, numbers))
在这里,我们声明我们列表中的一个项目为x
。然后我们添加我们的表达式。
为了立即收到结果,我们打印了地图
对象的列表:
1print(mapped_numbers)
1[secondary_label Output]
2[23, 33, 45, 69, 87, 113]
我们使用了list()
,以便将地图对象返回给我们作为一个列表,而不是一个不那么易于人读的对象,例如:<map object at 0x7fc250003a58>
。
最终,map()
在处理大数据集时是最有用的,所以我们可能会进一步与地图对象合作,一般不会在它们上使用类似list()
的构造器。
对于较小的数据集,列表理解可能更合适,但对于本教程的目的,我们正在使用一个小数据集来演示map()
。
执行用户定义函数
与lambda
类似,我们可以使用我们已定义的函数应用于可迭代的函数,而当您使用一行表达式时,在实施lambda
函数时更有用时,用户定义的函数在表达式变得更加复杂时更适合。
例如,在下面的迭代中,每个项目都是一个词典,包含我们每一个水族馆生物的不同细节:
1aquarium_creatures = [
2 {"name": "sammy", "species": "shark", "tank number": 11, "type": "fish"},
3 {"name": "ashley", "species": "crab", "tank number": 25, "type": "shellfish"},
4 {"name": "jo", "species": "guppy", "tank number": 18, "type": "fish"},
5 {"name": "jackie", "species": "lobster", "tank number": 21, "type": "shellfish"},
6 {"name": "charlie", "species": "clownfish", "tank number": 12, "type": "fish"},
7 {"name": "olly", "species": "green turtle", "tank number": 34, "type": "turtle"}
8]
我们已经决定所有的水族馆生物实际上将移动到同一个坦克里,我们需要更新我们的记录,以反映我们所有的生物正在移动到坦克42
。
1def assign_to_tank(aquarium_creatures, new_tank_number):
2 def apply(x):
3 x["tank number"] = new_tank_number
4 return x
5 return map(apply, aquarium_creatures)
我们定义一个assign_to_tank()
函数,该函数将aquarium_creatures
和new_tank_number
作为参数。在assign_to_tank()
中,我们将apply()
作为函数传递给map()
在最后一行上。
apply()
将 'x' 作为一个参数,它代表了我们列表中的一个项目 - 一个单一的字典。
接下来,我们定义x
是aquarium_creatures
的坦克号
密钥,它应该存储在new_tank_number
中传递的信息。
我们与我们的字典列表和我们想要替代每个生物的新坦克号一起调用 assign_to_tank()
:
1assigned_tanks = assign_to_tank(aquarium_creatures, 42)
一旦函数完成,我们将我们的地图对象存储在 assigned_tanks
变量中,我们将其变成列表并打印:
1print(list(assigned_tanks))
我们将从这个程序中获得以下输出:
1[secondary_label Output]
2[{'name': 'sammy', 'species': 'shark', 'tank number': 42, 'type': 'fish'}, {'name': 'ashley', 'species': 'crab', 'tank number': 42, 'type': 'shellfish'}, {'name': 'jo', 'species': 'guppy', 'tank number': 42, 'type': 'fish'}, {'name': 'jackie', 'species': 'lobster', 'tank number': 42, 'type': 'shellfish'}, {'name': 'charlie', 'species': 'clownfish', 'tank number': 42, 'type': 'fish'}, {'name': 'olly', 'species': 'green turtle', 'tank number': 42, 'type': 'turtle'}]
使用我们定义的函数,我们可以嵌入map()
,以便在列表中的每个项目上有效地应用该函数。
使用多重 iterables 的内置函数
与‘lambda’函数或我们自己的定义函数相同,我们可以使用Python内置函数与‘map()’。 为了应用一个函数具有多个可迭代,我们将另一个可迭代的名称传递给第一个。
以下是我们想要用「pow()」的整数列表:
1base_numbers = [2, 4, 6, 8, 10]
2powers = [1, 2, 3, 4, 5]
接下来,我们将pow()
作为我们的函数输入到map()
,并提供两个列表作为我们的迭代:
1numbers_powers = list(map(pow, base_numbers, powers))
2
3print(numbers_powers)
因此,我们的结果将显示2**1
,4**2
,6**3
,等等:
1[secondary_label Output]
2[2, 16, 216, 4096, 100000]
如果我们将map()
提供一个比另一个更长的迭代式,那么map()
将停止计算,一旦它达到最短的迭代式的尽头,在以下程序中,我们将base_numbers
扩展到三个额外的数字:
1base_numbers = [2, 4, 6, 8, 10, 12, 14, 16]
2powers = [1, 2, 3, 4, 5]
3
4numbers_powers = list(map(pow, base_numbers, powers))
5
6print(numbers_powers)
因此,在这个程序的计算中不会发生任何变化,因此它仍然会产生相同的结果:
1[secondary_label Output]
2[2, 16, 216, 4096, 100000]
我们已经使用了map()
函数与Python内置函数,并看到它可以处理多个迭代,我们还审查了map()
将继续处理多个迭代,直到它达到具有最少元素的迭代的尽头。
结论
在本教程中,我们了解了在Python中使用map()
函数的不同方法,现在您可以使用map()
与自己的函数、一个lambda
函数以及任何其他内置函数一起使用。
在本教程中,我们将从map()
的结果立即打印到列表格式,用于演示目的. 在我们的程序中,我们通常会使用返回的地图对象进一步操纵数据。
如果您想了解更多关于 Python 的信息,请参阅我们的 How To Code in Python 3]系列和我们的 Python 主题页面。