【问题标题】:Python map vs list comprehension [duplicate]Python地图与列表理解[重复]
【发布时间】:2011-09-02 23:21:18
【问题描述】:

比较这些时,您认为哪个更直观/更易于阅读?

>>> [ord(i) for i in 'some string']
[115, 111, 109, 101, 32, 115, 116, 114, 105, 110, 103]

>>> map(ord,'some string')
[115, 111, 109, 101, 32, 115, 116, 114, 105, 110, 103]

lambda/map 方式有什么好处吗?

【问题讨论】:

  • 我更喜欢第一个,更容易阅读。
  • 我在这里似乎是一个孤独的声音,但我认为第二个更具可读性。 i 在第一个示例中没有实际的语义内容,因此第二个更短(通常本身更好),并且它还需要跟踪的东西更少。当对象具有语义内容时,这会更加清晰,因此您很想使用更详细的变量来保持代码的可读性:例如[get_foo_for_barspam(barspam) for barspam in barspams] 也就是说,理解有优势(例如元组解包)并且它们更加灵活比地图(尽管另见itertools.starmap)。
  • 我发现地图更直观。但它非常主观,我在了解列表推导之前就了解了 map,这可能就是原因。我发现 RecursivelyIronics 关于 i 缺乏语义价值的观点是有优点的。此外,地图方式更短。长度论点很蹩脚,但至少是客观的。
  • 需要注意的是,链接问题的OP中的性能数字已经过时了。显然,最近的版本显着提高了map 与理解的相对性能。是的,我确实考虑到需要明确列出结果。

标签: python loops lambda


【解决方案1】:

我更喜欢第一个,它有一个优势。你可以代替

[ord(i) for i in 'some string']

(ord(i) for i in 'some string')

并且有一个生成器而不是制作一个列表。在某些情况下很棒。

【讨论】:

  • itertools.imapmap 的类比,所以这对于任何一种变体都不是真正的优势。
  • 我也最喜欢列表理解。为那个生成器提示 +1,我不知道。
  • 而在python3中,map总是生成一个生成器。
【解决方案2】:

我更喜欢第一个,因为我更习惯了。做很多函数式编程的人可能更喜欢第二种,因为它更适合它的思维定势。但是第二个版本太复杂了。可以简化为

map(ord,'some string')

这更具可读性,并使想法更加明显。

【讨论】:

  • 我会更新问题-谢谢
  • +1,但列表推导式也是函数式编程结构,不是吗?无论如何,他们都在 Haskell 中。
【解决方案3】:

我会使用:[ord(i) for i in 'some string']。据说使用带有 lambda 的 map 比使用列表推导要慢得多。请参阅Python List Comprehension Vs. Map 第一个在我看来也更具可读性。

【讨论】:

  • [ord(c) for c in 50 * ''.join(chr(i) for i in range(256))]map(ord, 50 * ''.join(chr(i) for i in range(256))) 慢大约 33%(试试看!)
  • 我相信 OP 修改了问题,我记得第二个选项中有一个 lambda。
【解决方案4】:

这似乎已经被问及回答before

【讨论】:

  • 我认为它是-我正在寻找它,但我的搜索功能并不出色。谢谢
猜你喜欢
  • 1970-01-01
  • 2010-11-17
  • 2011-06-15
  • 2011-02-28
  • 1970-01-01
  • 2018-03-20
  • 2017-02-27
相关资源
最近更新 更多