如何使用 Python Map 函数

介绍

我们可以使用 Python 内置函数map()将函数应用于可迭代对象(如列表字典中的每个项目,并返回一个新的迭代器以检索结果。map()返回一个映射对象(一个迭代器),我们可以在程序的其他部分使用它。我们还可以将 map 对象传递给list()函数或其他序列类型,以创建一个可迭代对象。

map()函数的语法如下:

map(function, iterable, [iterable 2, iterable 3, ...])

函数没有使用for循环而是map()提供了一种将函数应用于可迭代对象中的每个项目的方法。因此,它通常可以提高性能,因为它一次只应用一个项目,而不是将项目的副本复制到另一个可迭代对象中。这在处理大型数据集的程序中特别有用。map()还可以通过一次从每个可迭代对象向函数发送一个项目,将多个可迭代对象作为函数的参数。

在本教程中,我们将回顾使用 的三种不同方式map():使用lambda函数、使用用户定义的函数,最后使用使用多个可迭代参数的内置函数。

使用 Lambda 函数

的第一个参数map()是一个函数,我们用它来应用于每个项目。Python 为我们传入的可迭代对象中的每个项目调用一次该函数map(),并返回映射对象中被操作的项目。对于第一个函数参数,我们可以传递用户定义的函数,也可以使用lambda函数,尤其是当表达式不太复杂时。

map()with lambda 函数的语法如下:

map(lambda item: item[] expression, iterable)

使用如下所示的列表,我们可以lambda使用要应用于列表中的每个项目的表达式来实现一个函数:

numbers = [10, 15, 21, 33, 42, 55]

要对我们的每个数字应用表达式,我们可以使用map()lambda

mapped_numbers = list(map(lambda x: x * 2 + 3, numbers))

在这里,我们将列表中的一个项目声明为x然后我们添加我们的表达式。我们将数字列表作为 的可迭代对象传入map()

为了立即接收结果,我们打印一个map对象列表

print(mapped_numbers)
Output
[23, 33, 45, 69, 87, 113]

我们已经使用,list()以便将地图对象作为列表返回给我们,而不是像这样的人类可读性较差的对象:<map object at 0x7fc250003a58>map 对象是我们结果的迭代器,所以我们可以循环遍历它,for或者我们可以使用list()它把它变成一个列表。我们在这里这样做是因为这是查看结果的好方法。

最终map()在处理大型数据集时最有用,因此我们可能会进一步处理地图对象,并且通常不会使用像list()它们这样的构造函数

对于较小的数据集,列表推导式可能更合适,但出于本教程的目的,我们使用小数据集来演示map().

实现用户定义的函数

与 a 类似,lambda我们可以使用我们定义的函数来应用于可迭代对象。虽然lambda在使用单行表达式时实现函数更有用,但当表达式变得越来越复杂时,用户定义的函数更合适。此外,当我们需要将另一条数据传递给您应用到可迭代对象的函数时,用户定义的函数可能是提高可读性的更好选择。

例如,在以下可迭代对象中,每一项都是一个字典,其中包含有关我们每个水族馆生物的不同详细信息:

aquarium_creatures = [
    {"name": "sammy", "species": "shark", "tank number": 11, "type": "fish"},
    {"name": "ashley", "species": "crab", "tank number": 25, "type": "shellfish"},
    {"name": "jo", "species": "guppy", "tank number": 18, "type": "fish"},
    {"name": "jackie", "species": "lobster", "tank number": 21, "type": "shellfish"},
    {"name": "charlie", "species": "clownfish", "tank number": 12, "type": "fish"},
    {"name": "olly", "species": "green turtle", "tank number": 34, "type": "turtle"}
]

我们已经决定所有的水族馆生物实际上都将搬到同一个水族箱中。我们需要更新我们的记录以反映我们所有的生物都在移动到 tank 中42为了map()访问字典中的每个字典和每个键:值对,我们构造了一个嵌套函数:

def assign_to_tank(aquarium_creatures, new_tank_number):
    def apply(x):
        x["tank number"] = new_tank_number
        return x
    return map(apply, aquarium_creatures)

我们定义了一个assign_to_tank()aquarium_creaturesnew_tank_number作为参数的函数。assign_to_tank()我们将apply()函数传递map()最后一行。assign_to_tank函数将返回由 产生的迭代器map()

apply()接受x一个参数,它代表我们列表中的一个项目——一个字典。

接下来我们定义它x"tank number"fromaquarium_creatures,它应该存储传入的new_tank_number. 我们在应用新的罐号后退回每个项目。

我们调用assign_to_tank()我们的字典列表和我们要为每个生物替换的新坦克编号:

assigned_tanks = assign_to_tank(aquarium_creatures, 42)

函数完成后,我们将地图对象存储在assigned_tanks变量中,我们将其转换为列表并打印:

print(list(assigned_tanks))

我们将从该程序中收到以下输出:

Output
[{'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()以有效地将函数应用于列表的每个项目。

使用具有多个可迭代对象的内置函数

lambda函数或我们自己定义的函数一样,我们可以使用带有map(). 要应用具有多个可迭代的函数,我们在第一个可迭代名称之后传入另一个可迭代名称。例如,使用接受两个数字pow()函数来计算基数对提供的指数的幂。

这里我们有我们想要使用的整数列表pow()

base_numbers = [2, 4, 6, 8, 10]
powers = [1, 2, 3, 4, 5]

接下来,我们将pow()作为我们的函数传入map()并提供两个列表作为我们的可迭代对象:

numbers_powers = list(map(pow, base_numbers, powers))

print(numbers_powers)

map()pow()函数应用于每个列表中的相同项目以提供电源。因此,我们的结果将显示2**14**26**3等:

Output
[2, 16, 216, 4096, 100000]

如果我们提供map()一个比另一个长的可迭代对象,map()一旦它到达最短的可迭代对象末尾就会停止计算。在下面的程序中,我们扩展base_numbers了三个额外的数字:

base_numbers = [2, 4, 6, 8, 10, 12, 14, 16]
powers = [1, 2, 3, 4, 5]

numbers_powers = list(map(pow, base_numbers, powers))

print(numbers_powers)

因此,该程序的计算中不会发生任何变化,因此仍会产生相同的结果:

Output
[2, 16, 216, 4096, 100000]

我们已经将该map()函数与 Python 内置函数一起使用,并且已经看到它可以处理多个可迭代对象。我们还审查了map()将继续处理多个可迭代对象,直到达到具有最少项目的可迭代对象的末尾。

结论

在本教程中,我们学习了map()在 Python中使用该函数的不同方式现在,您可以使用map()自己的函数、lambda函数以及任何其他内置函数。您还可以map()使用需要多个迭代的函数来实现

在本教程中,map()出于演示目的,我们将结果立即打印为列表格式。在我们的程序中,我们通常会使用返回的地图对象来进一步操作数据。

如果您想了解更多 Python,请查看我们的How To Code in Python 3系列和我们的Python 主题页面要了解有关在函数式编程中使用数据集的更多信息,请查看我们关于filter()函数文章

觉得文章有用?

点个广告表达一下你的爱意吧 !😁