【问题标题】:Python: map in place [duplicate]Python:就地映射[重复]
【发布时间】:2011-03-01 08:05:59
【问题描述】:

我想知道是否有办法在某物上运行地图。 map 的工作方式是它需要一个可迭代对象并将一个函数应用于该可迭代对象中的每个项目,从而生成一个列表。有没有办法让 map 修改可迭代对象本身?

【问题讨论】:

  • 您只能在 Python 中使用可变序列(即列表)有效地执行此操作,而不是任意可迭代的。
  • 对,我正在处理一个列表。

标签: python iterable map-function


【解决方案1】:

如果您需要就地修改列表,通常可以使用切片分配

mylist[:] = map(func, mylist)

【讨论】:

  • 这种方法有什么缺点?从记忆的角度来看,它与for i, item in enumerate(mylist): mylist[i] = func(item)几乎相同?
  • @warvariuc,你也可以使用生成器表达式mylist[:] = (func(item) for item in mylist)。如果你已经在某处定义了func,你应该选择更具可读性的那个。
  • 但是mylist[:] = map(func, mylist)mylist[:] = (func(item) for item in mylist) 是否等同于for i, item in enumerate(mylist): mylist[i] = func(item)
  • @warvariuc,是的,它们或多或少是等价的。
  • 我只想mylist = list(map(func, mylist))
【解决方案2】:

写起来很简单:

def inmap(f, x):
    for i, v in enumerate(x):
            x[i] = f(v)

a = range(10)
inmap(lambda x: x**2, a)
print a

【讨论】:

  • 这在逻辑上是正确的,但我想使用 map 来提高性能...
  • 我认为您无法从中获得更多性能。如果你想并行化它,由于 GIL,你将无法使用 Python 来完成它。
【解决方案3】:

只需编写明显的代码即可。

for i, item in enumerate(sequence):
    sequence[i] = f(item)

【讨论】:

  • 我已经试过了......奇怪的是它比列表理解要慢。我问这个问题的原因是因为我认为 map 会比列表理解方式更快,而且我没有看到创建新列表的意义,但到目前为止,列表理解是获胜的。
  • 列表理解 == map 的语法糖
  • 你如何解释性能下降?地图的速度大约慢了一倍。
  • @cvondrick 列表推导是 for 循环的语法糖,而不是 map。
  • @jemfinch 如果是微秒,我显然不会在意。我正在处理一个大列表,我们谈论的时间相差几秒钟,这显然很重要......
【解决方案4】:

您可以使用 lambda(或 def)或更好的列表理解(如果足够的话):

[ do_things_on_iterable for item in iterable ]

无论如何,如果事情变得过于复杂,您可能希望使用 for 循环更加明确。

例如,您可以做类似的事情,但恕我直言,这很丑:

[ mylist.__setitem__(i,thing) for i,thing in enumerate(mylist) ]

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 2021-06-09
    • 1970-01-01
    • 2019-02-10
    • 2014-11-30
    • 2019-11-11
    • 2018-11-13
    • 1970-01-01
    • 2016-08-31
    相关资源
    最近更新 更多