RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1539649
Accepted
Глеб
Глеб
Asked:2023-09-08 18:32:13 +0000 UTC2023-09-08 18:32:13 +0000 UTC 2023-09-08 18:32:13 +0000 UTC

map() 函数或列表包含?

  • 772

在 Python 中,有两种方法可以将函数应用于可迭代对象的每个元素:

  1. 功能map():
>>> lst = [1, 2, 3, 4]
>>> list(map(str, lst))
['1', '2', '3', '4']
>>> list(map(lambda a: a + 1, lst))
[2, 3, 4, 5]

  1. 列表包含:
>>> lst = [1, 2, 3, 4]
>>> [str(i) for i in lst]
['1', '2', '3', '4']
>>> [i + 1 for i in lst]
[2, 3, 4, 5]

《Python 之禅》中有这样一句话:

应该有一种——最好只有一种——明显的方法来做到这一点。

应该有一种,最好只有一种,明显的方法来做到这一点。

由于有两种方法可以将函数应用于可迭代对象,因此 Python 的创建者有充分的理由引入它们。

问题出现了:哪些?在上面的示例中,这两种方法看起来都很自然。显然,存在仅使用这些方法中的一种更容易的问题。那么什么时候最好使用map()以及什么时候最好将其包含在列表中呢?

python
  • 2 2 个回答
  • 158 Views

2 个回答

  • Voted
  1. mister_svinia
    2023-09-08T18:40:38Z2023-09-08T18:40:38Z

    生成器(称为短迭代器)可以使用流条件。同时map不受外界条件影响。如果您只需要对每个元素应用一个函数(甚至是 lambda),请使用map. 返回的对象可以迭代并转换为list(如您的代码中所示)。当您需要生成并继续使用它时,生成器更适合,一个可迭代的对象,可能带有条件,或者只是一个填充的对象。

    UPD | 显示 和 生成器之间差异的代码示例map:

    通过功能map:

    numbers = [1, 2, 3, 4, 5]
    result = list(map(lambda x: x * 2, numbers))
    print(result)  # Output: [2, 4, 6, 8, 10]
    

    通过生成器:

    numbers = [1, 2, 3, 4, 5]
    result = [x * 2 for x in numbers]
    print(result)  # Output: [2, 4, 6, 8, 10]
    

    简单来说,当需要对对象进行操作(方法、算术运算)或者需要map转换对象时,即从技术上讲,转换对象本身不被保存时,最好使用生成器。

    • 1
  2. Best Answer
    wchistow
    2023-09-13T19:47:43Z2023-09-13T19:47:43Z

    从英文答案翻译到Python.org 上的讨论


    如果只有一种“明显的方法来做到这一点”,那就太好了,但这几乎是不可能的。不同的事情对不同的人来说似乎是显而易见的。这条规则更多的是针对语言开发人员而不是程序员:当有一个常见任务需要多行代码,并且人们编写代码的方式不同,并且每种方式都需要一点思考......那么最好让语言提供更明确的支持。即使每个人都这样做,也不应该显得太抽象。遵循这一原则,我们可以获得令人愉快的便利设施,例如random.choice。

    至于map与列表包含的比较,这是我(Karl Knechtel)的个人指南:

    列表包含通常是首选。

    使用map时:

    • 您想要应用的函数已经存在(特别是如果它是内联的):
      >>> # можно и так
      >>> [str(x) for x in range(10)]
      ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
      >>> # способ с map короче, что может быть преимуществом
      >>> list(map(str, range(10)))
      ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
      
    • 您可以轻松地通过函数编写转换,前提是该函数从并行列表中获取多个参数:
      >>> [x*y for x, y in zip(range(10), range(10, 20))]
      [0, 11, 24, 39, 56, 75, 96, 119, 144, 171]
      >>> # в map уже встроена zip
      >>> list(map(lambda x, y: x*y, range(10), range(10, 20)))
      [0, 11, 24, 39, 56, 75, 96, 119, 144, 171]
      

    当您还需要过滤时,列表包含特别好:

    >>> list(map(lambda x: x + 1, filter(lambda x: x % 3, range(10))))
    [2, 3, 5, 6, 8, 9]
    >>> # гораздо проще
    >>> [x + 1 for x in range(10) if x % 3]
    [2, 3, 5, 6, 8, 9]
    

    在Python3中map它是“懒惰的”。如果您需要此延迟结果,但想要使用列表包含语法,请改为编写生成器表达式:

    >>> [x for x in range(10)]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> (x for x in range(10)) # В результате получается не кортеж
    <generator object <genexpr> at 0x7f1ddd439120>
    

    生成的生成器对象可以按照与显示结果相同的基本方式使用。(存在技术差异,但在这里并不重要。)

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5