Python map() 函数(转换可迭代对象)

2023-10-23

The map()Python 中的 function 是一个内置函数,用于将函数应用于可迭代对象(数组、列表、元组、字典、集合)中的每个项目并返回一个迭代器。

这使得它对于转换可迭代数据非常有用。

 

 

Python map() 函数的语法

Python 的语法map()功能很简单。它需要一个函数和一个或多个可迭代对象,并将该函数应用于可迭代中的每一项:


map(function, iterable, ...)
  

使用的主要好处之一map()功能是可读性和效率。它允许您对可迭代中的每个项目执行操作,而无需使用显式 for 循环,这在处理大量数据时速度更快,正如您将在本教程后面看到的那样。
考虑以下示例:


def add_two(x):
    return x + 2
numbers = [1, 2, 3, 4, 5]
addition = map(add_two, numbers)
print(list(addition))
  

Output:


[3, 4, 5, 6, 7]
  

这里我们定义一个函数add_two()它接受一个整数作为输入并返回该整数加 2。然后我们使用这个函数map(),这适用于add_two()到数字列表中的每个项目。

结果是一个新列表,其中每个元素都是原始列表中对应的元素增加 2。

 

map()的返回类型

当你使用Python时map()函数,它不会立即返回结果列表。相反,它返回一个iterator.

这是一个在迭代结果时即时生成结果的对象,这比一次生成所有结果更节省内存。
下面是一个简单的例子来演示这一点:


def multiply_by_two(x):
    return x * 2
numbers = [1, 2, 3, 4, 5]
result = map(multiply_by_two, numbers)
print(result)
print(list(result))
  

Output:


<map object at 0x7f216e6f5970>
[2, 4, 6, 8, 10]
  

第一个打印语句打印地图对象本身,它是一个迭代器。第二个打印语句将映射对象转换为列表,强制生成所有结果。
您可以在 for 循环中使用返回的迭代器,将其转换为列表或元组,或者由接受可迭代对象作为输入的函数使用。

 

Python 2 与 Python 3 中的 map() 函数

虽然整体概念和用法map()函数保持不变,Python 2 和 Python 3 之间的实现有一个关键的区别。
在Python 2中,map()返回一个列表:


# Python 2
numbers = [1, 2, 3, 4, 5]
result = map(lambda x: x**2, numbers)
print(result)  # Output: [1, 4, 9, 16, 25]
  

在Python 3中,map()返回一个迭代器:


# Python 3
numbers = [1, 2, 3, 4, 5]
result = map(lambda x: x**2, numbers)
print(result)  # Output: <map object at 0x10d238d30>
print(list(result))  # Output: [1, 4, 9, 16, 25]
  

这一变化使得map()Python 3 中的内存效率更高,因为整个结果列表不是一次性生成的,而是在迭代结果时一次生成一个。

 

传递多个可迭代对象

在上面的例子中,我们使用了map()具有单个可迭代的函数。事实上,map()函数还可以将多个可迭代对象作为参数。

当与多个可迭代对象一起使用时,映射函数将以并行方式将其函数应用于可迭代对象的项。

这意味着它将函数应用于每个可迭代的第一项,然后应用于每个可迭代的第二项,依此类推。

函数必须采用的参数数量应与可迭代的数量相对应。


def add_numbers(x, y):
    return x + y
numbers1 = [1, 2, 3, 4, 5]
numbers2 = [10, 20, 30, 40, 50]
result = map(add_numbers, numbers1, numbers2)
print(list(result))
  

Output:


[11, 22, 33, 44, 55]
  

在这个例子中,我们定义了一个函数add_numbers()它接受两个参数并返回它们的总和。然后我们使用map()具有此函数和两个数字列表的函数。

The map()功能适用add_numbers()列表中的每对项目(每个列表中的第一个项目,每个列表中的第二个项目等)并返回一个迭代器。我们将此迭代器转换为列表并打印结果的总和列表。

 

使用 Lambda 函数

Lambda 函数(lambda 表达式),也称为匿名函数,是使用 lambda 表达式定义的小型未命名函数。lambda关键词。

与我们上面使用的自定义函数不同,您可以在map()功能来创建快速转换。

以下是如何使用 lambda 函数map():


numbers = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, numbers)
print(list(squared))  

Output:


[1, 4, 9, 16, 25]  

这里,lambda 函数接受一个输入x并返回x平方。我们使用这个函数map()和一个数字列表,以及map()将 lambda 函数应用于列表中的每个数字。结果是一个新的数字平方列表。

 

带有字典的 map() 函数

您可以使用map()也可以与词典一起使用。需要注意的是,当使用字典时map(),该函数默认应用于字典的键。

操作按键


def make_upper(key):
    return key.upper()

fruit_colors = {'apple': 'red', 'banana': 'yellow', 'grape': 'purple'}
result = map(make_upper, fruit_colors)

print(list(result))
  

Output:


['APPLE', 'BANANA', 'GRAPE']
  

在此示例中,make_upper()函数用于将字典键转换为大写。我们使用内置的map()函数,适用于make_upper()到字典中的每个键。

操纵价值观

如果你想操作字典的值,你可以使用dict.values() method:


def add_exclamation(value):
    return value + '!'
fruit_colors = {'apple': 'red', 'banana': 'yellow', 'grape': 'purple'}
result = map(add_exclamation, fruit_colors.values())
print(list(result))
  

Output:


['red!', 'yellow!', 'purple!']
  

在这里,add_exclamation()函数为字典中的每个值添加感叹号。我们将这些值传递给map(),这适用于add_exclamation()给每一位。

 

速度比较

The map()功能通常比手册更快for循环,因为它是用 C 实现的并且可以利用向量化运算。

我使用 timeit 模块进行了简单的速度比较。使用简单的操作,将列表或数组中的每个数字加倍。

我用的是timeitPython 中的模块来测量使用每种方法执行此操作所需的时间。

这是一个实验计划:

  1. 我创建了一个列表100万个号码.
  2. I measured the time it takes to double each number in the list using the following methods:
    • Python map功能
    • 列表理解
    • For loop

我将每个操作运行 10 次并取平均值以获得更准确的测量。


import timeit
size = 10**6
lst = list(range(size))

# Define the operation (doubling each number)
operation = lambda x: x * 2

# Define the number of runs for the benchmark
runs = 10

# Benchmark the map function
start = timeit.default_timer()
for _ in range(runs):
    result = list(map(operation, lst))
map_time = (timeit.default_timer() - start) / runs

# Benchmark list comprehension
start = timeit.default_timer()
for _ in range(runs):
    result = [operation(x) for x in lst]
list_comp_time = (timeit.default_timer() - start) / runs

# Benchmark for loop
start = timeit.default_timer()
for _ in range(runs):
    result = []
    for x in lst:
        result.append(operation(x))
for_loop_time = (timeit.default_timer() - start) / runs

print(map_time)
print(list_comp_time)
print(for_loop_time)
  

Output:


0.1796810700005153
0.18024229000147898
0.3354743200005032  

如您所见,map函数比列表理解稍快,并且两者都比标准快得多for loop.

 

map() 和 filter() 之间的区别

虽然map() and filter()函数的相似之处在于它们都接受一个函数和一个可迭代对象作为参数,但它们有不同的用途。
The map()function 将给定函数应用于可迭代的每个项目并返回结果列表。另一方面,filter()function 从可迭代对象的元素构造一个列表,函数返回 true。
下面是一个例子来说明差异:


numbers = [1, 2, 3, 4, 5]

# Using map function to square the numbers
result_map = map(lambda x: x**2, numbers)
print(list(result_map))  # Output: [1, 4, 9, 16, 25]

# Using filter function to get only even numbers
result_filter = filter(lambda x: x % 2 == 0, numbers)
print(list(result_filter))  # Output: [2, 4]
  

在上面的例子中,map()将 lambda 函数应用于每个元素,因此结果的长度与输入列表相同。filter()但是,应用 lambda 函数并仅保留函数返回 True 的那些元素。

 

使用 map() 解决的现实问题

为了进一步说明该功能的强大功能和多功能性map()函数,让我们看看如何使用它来解决现实世界的问题。
数据转换
假设您正在处理客户评论数据集,并且需要通过将文本全部小写并删除标点符号来规范化文本。

您可以定义一个转换函数,然后使用map()将此函数应用于数据集中的每个评论:


import string

# Define the transformation function
def normalize_text(text):
    text = text.lower()  # Convert to lowercase
    text = text.translate(str.maketrans('', '', string.punctuation))  # Remove punctuation
    return text
reviews = ["Great product!", "I love it.", "Best purchase I've made."]
normalized_reviews = map(normalize_text, reviews)
print(list(normalized_reviews))
  

Output:


['great product', 'i love it', 'best purchase ive made']  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python map() 函数(转换可迭代对象) 的相关文章

  • Python 中的 Flask 错误:“无法导入 webapp”

    我正在尝试运行 Flask 但是 每当我输入 flask run 时 都会出现错误 Could not import webapp 作为参考 我正在使用 Visual Studio Code 并运行以下代码 from flask impor
  • lxml 中的通配符命名空间

    如何使用 xpath 忽略 xml 命名空间进行查询 我正在使用 python lxml 库 我尝试了以下解决方案this https stackoverflow com questions 13463871 xpath selecting
  • 如何从字典构造defaultdict?

    如果我有d dict zip range 1 10 range 50 61 我怎样才能建立一个collections defaultdict出于dict 唯一的论点defaultdict似乎采取的是工厂功能 我必须初始化然后再经历原来的d并
  • 使用 scikit 确定每个特征对特定类别预测的贡献

    我正在使用 scikit 额外的树分类器 model ExtraTreesClassifier n estimators 10000 n jobs 1 random state 0 一旦模型拟合并用于预测类别 我想找出每个特征对特定类别预测
  • 通过pip安装lxml时出错:需要Microsoft Visual C++ 14.0

    我使用的是 Windows 10 机器 最近从 python 2 7 迁移到 3 5 当尝试通过 pip 安装 lxml 时 它会停止并抛出此错误消息 构建 lxml etree 扩展错误 需要 Microsoft Visual C 14
  • Python:合并嵌套列表

    初学者在这里 我有 2 个要合并的嵌套列表 list1 a b c d e f g h list2 p q r s t u v w 我正在寻找的输出是 list3 a p q b c r s d e t f g h u v w 这可以在没有
  • 在heroku实例上安装PIL

    我创建了一个python flask托管在heroku上的应用程序 我很有趣PILpython 中的图像库 我无法安装PIL在heroku实例中 我尝试过以下几种方法 方法一 Added PIL 1 1 7 in requirements
  • Pytorch“展开”等价于 Tensorflow [重复]

    这个问题在这里已经有答案了 假设我有大小为 50 50 的灰度图像 在本例中批量大小为 2 并且我使用 Pytorch Unfold 函数 如下所示 import numpy as np from torch import nn from
  • 如何从numpy数组中获取两个最小值

    我想从数组中取出两个最小值x 但是当我使用np where A B np where x x min 0 1 我收到此错误 ValueError 需要超过 1 个值才能解压 我该如何修复这个错误 我需要在数组中按升序排列数字吗 您可以使用n
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • 在 matplotlib 中查看然后自动关闭图形?

    我必须检查我的参数设置是否正确 因此我需要绘制许多图 为了绘制这些图 我选择使用 matplotlib 每次检查后 我需要单击左上角的关闭按钮 这很微不足道 那么有没有什么方法可以让剧情在3 5秒左右显示并且无需点击就自动关闭呢 我知道关于
  • Pandas 数据框列总和并收集结果

    给定以下数据框 import pandas as pd p1 name willy age 11 interest Lego p2 name willy age 11 interest games p3 name zoe age 9 int
  • 如何在这个可嵌套的 For 循环中实现 Robot Framework 风格的变量?

    我在 Robot Framework 中见过很多 嵌套 For 循环 主要是创建一个内部带有 For 循环的关键字 然后在另一个 For 循环中调用该关键字 我使用 Python 2 7 13 制作了一个可嵌套的 For 循环 但因为它主要
  • 将 csv 写入谷歌云存储

    我试图了解如何将多行 csv 文件写入谷歌云存储 我只是没有遵循文档 https googlecloudplatform github io google cloud python stable storage blobs html hig
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • Pytest 插件:覆盖 pytest_runtest_call 和朋友

    我正在为我的一个项目使用 pytest 开发一个测试套件 由于项目的性质 我需要创建一个 Pytest 插件来控制测试的运行方式 它们不是在本地运行 而是发送到不同的进程来运行 我知道关于xdist但我认为这并不能解决我的问题 我一直在通过
  • 当前异常上下文掩盖了先前的错误

    以下是我在 Doug Hellman 网站上名为 masking exceptions catch py 的文件中找到的示例 我暂时无法找到链接 throws 中引发的异常将被丢弃 而 cleanup 中引发的异常将被报告 道格在他的文章中
  • 随机数生成器每次仅返回一个数字

    Python 是否有一个随机数生成器 每次只返回一个随机整数next 函数被调用 数字不应该重复并且生成器应返回区间内的随机整数 1 1 000 000 这是独一无二的 我需要生成超过一百万个不同的数字 这听起来好像非常消耗内存 以防所有数
  • 将 sudo 与 Python 脚本结合使用

    我正在尝试编写一个小脚本来在每次执行脚本时安装 VirtualBox 共享文件夹 我想用Python 来做这件事 因为我正在尝试学习它来编写脚本 问题是我需要特权才能启动挂载命令 我可以将脚本作为 sudo 运行 但我更喜欢它自己创建 su
  • 无法比较类型“ndarray(dtype=int64)”和“str”

    Example of data that I want to replace 数据具有以下属性 购买 V 高 高 中 低 维持 V 高 高 中 低 门 2 3 4 5 更多 2 4人以上 lug boot 小 中 大 安全性低 中高 这就是

随机推荐

  • 如何在 Linux 中创建交换文件

    交换文件是 Linux 操作系统的重要组件 它通过提供额外的虚拟内存来帮助提高性能 它是在系统物理内存 RAM 填满时保留用作虚拟内存的磁盘空间 在 Linux 中创建交换文件有助于防止系统崩溃和不稳定 在本文中 我们将逐步讨论如何在 Li
  • 如何在 phpMyAdmin 中添加多个主机

    phpMyAdmin 默认配置仅允许连接到本地 MySQL 服务器 但是如果我们运行多个数据库服务器 那么如果我们可以从单个 phpMyAdmin 安装中选择需要连接的服务器 那就太好了 本操作指南将帮助您在 phpMyAdmin 中添加多
  • Bash 选择(制作菜单)

    在本教程中 我们将介绍以下基础知识select在 Bash 中构建 The select构造允许您生成菜单 Bash select构造 The select构造从项目列表生成菜单 它的语法几乎与for loop select ITEM in
  • 如何在 CentOS 7 上安装和配置 Redmine

    Redmine 是最流行的开源项目管理和问题跟踪软件工具之一 它是跨平台和跨数据库的 构建在 Ruby on Rails 框架之上 Redmine包括对多个项目 wiki 问题跟踪系统 论坛 日历 电子邮件通知等的支持 在本教程中 我们将介
  • 如何在 Ubuntu 18.04 上部署 Rocket.Chat

    Rocket Chat 是一个开源团队交流平台 是自托管的 Slack 替代品 它使用 Meteor 框架开发 提供各种功能 包括帮助台聊天 文件共享 视频会议 语音消息 API 等 对于想要托管自己的聊天系统的公司和社区来说 Rocket
  • .bashrc 与 .bash_profile

    如果您在命令行上花费大量时间 您很可能想要自定义您的 shell 环境 这可能意味着创建别名 将新目录添加到 PATH 或更改 shell 提示符的外观 您可能遇到过一些教程 其中他们说将您的配置放在 bashrc bash profile
  • 如何在 CentOS 7 上安装和使用 PHP Composer

    Composer是 PHP 的依赖管理器 类似于Node js 的 npm or Python 的点子 Composer 将提取您的项目所依赖的所有必需的 PHP 包并为您管理它们 它用于所有现代 PHP 框架和平台 例如 Laravel
  • 如何在 CentOS 8 上安装 Apache

    Apache HTTP 服务器是世界上使用最广泛的 Web 服务器 它是一个免费 开源 跨平台的HTTP服务器 具有强大的功能 并且可以通过多种模块进行扩展 在本文中 我们将解释如何在 CentOS 8 上安装和管理 Apache Web
  • 如何在 Debian 9 上安装 CouchDB

    CouchDB 是一个开源的容错且无模式的 NoSQL 数据库 由 Apache 软件基金会维护 CouchDB 服务器将其数据存储在命名数据库中 其中包含以下文档JSON结构 每个文档由许多字段和附件组成 字段可以包括文本 数字 列表 布
  • 如何在 CentOS 7 上安装 Visual Studio Code

    视觉工作室代码是微软开发的开源跨平台代码编辑器 它有一个内置的调试支持 嵌入式Git控制 语法突出显示 代码完成 集成终端 代码重构和片段 在 CentOS 计算机上安装 Visual Studio Code 最简单且推荐的方法是启用 VS
  • 如何在 Ubuntu 18.04 上安装 Mono

    Mono 是一个用于开发和运行基于 ECMA ISO 标准的跨平台应用程序的平台 它是 Microsoft NET 框架的免费开源实现 本教程介绍如何在 Ubuntu 18 04 上安装 Mono 先决条件 这些说明假定您以 root 身份
  • Linux中的su命令(切换用户)

    The su 替代或切换用户的缩写 实用程序允许您使用其他用户 默认为 root 用户 的权限运行命令 Using su是在当前登录会话中切换到管理帐户的最简单方法 当不允许 root 用户通过以下方式登录系统时 这尤其方便ssh或使用 G
  • Linux 中的Whereis命令

    whereis是一个命令行实用程序 允许您查找给定命令的二进制文件 源文件和手册页文件的位置 在这篇文章中 我们将向您展示如何使用Linuxwhereis命令 如何使用whereis命令 语法为whereis命令如下 whereis OPT
  • 在 CentOS 8 上使用 Let's Encrypt 保护 Nginx

    Let s Encrypt 是由互联网安全研究小组 ISRG 开发的免费 自动化 开放的证书颁发机构 提供免费的 SSL 证书 Let s Encrypt 颁发的证书受到所有主要浏览器的信任 并且自颁发之日起 90 天内有效 在本教程中 我
  • Expect 命令以及如何像魔术一样自动化 shell 脚本

    在上一篇文章中 我们讨论了写作实用的shell脚本 我们看到了编写 shell 脚本是多么容易 今天我们要讨论一个对 shell 脚本有神奇作用的工具 该工具是期待命令 or 期待脚本语言 Expect 命令或 Expect 脚本语言是一种
  • SSH 连接被拒绝(原因和解决方案)

    本教程将介绍您在使用 SSH 时可能遇到的最常见错误 连接被拒绝 请继续阅读 详细了解这个问题及其各种解决方案 Secure Shell SSH 是系统管理员最常用的工具之一 它对于管理所有服务器和执行日常任务至关重要 目录 hide 1
  • Linux env 命令:深入了解 Linux 环境管理

    The envLinux中的命令用于显示或设置环境变量 它可用于在修改后的环境中运行程序或显示当前环境 在本教程中 我们将深入研究其各种论点 并揭示其与脚本的集成 目录 hide 1 参数概览 2 执行不带参数的 env 命令 3 使用 e
  • 揭示 Linux 虚拟文件系统的强大功能

    Linux 虚拟文件系统或虚拟文件系统通常是位于实际文件系统之上的一层 它允许用户访问不同类型的文件系统 可以将虚拟文件系统视为内核与实际文件系统之间的接口 这意味着您将在 etc fstab 文件中找不到这些 Linux 虚拟文件系统的任
  • NumPy 随机种子(生成可预测的随机数)

    在计算科学中 随机种子是生成的伪随机数序列的起点 这些数字看似随机 但它们遵循确定性序列 种子决定了该序列的初始状态 在 Python 中NumPy 库 您可以使用设置随机种子numpy random seed 功能 这将使随机数生成的输出
  • Python map() 函数(转换可迭代对象)

    The map Python 中的 function 是一个内置函数 用于将函数应用于可迭代对象 数组 列表 元组 字典 集合 中的每个项目并返回一个迭代器 这使得它对于转换可迭代数据非常有用 目录 hide 1 Python map 函数