2010-06-08 58 views
13

我想知道是否有某种方法可以在某些地方运行映射。映射工作的方式是需要一个迭代器,并将该函数应用于该迭代器中的每个项目,以产生一个列表。有没有办法让地图修改可迭代对象本身?Python:映射到位

+0

你只能有效地做到这一点在Python一个可变序列(即列表),而不是任意可迭代的。 – jemfinch 2010-06-08 19:28:10

+1

对,我正在做一个清单。 – johannix 2010-06-08 19:30:27

回答

1

您可以使用lambda(或DEF)或更好的列表理解(如果它是足够了):

[ do_things_on_iterable for item in iterable ] 

反正你可能希望更明确了for循环,如果事情变得太复杂。

例如,你可以这样做,是但恕我直言它的丑陋:

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

只写代码显然做到这一点。

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

我已经尝试过......奇怪它比列表理解慢。我问这个问题的原因是因为我认为地图比列表理解方式更快,而且我也没有看到创建新列表的重点,但到目前为止,列表理解正在赢得胜利。 – johannix 2010-06-08 19:25:03

+0

列表理解==语法糖的地图 – carl 2010-06-08 19:25:51

+2

你如何解释性能打击呢?地图大约是慢两倍。 – johannix 2010-06-08 19:26:47

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 
+0

这在逻辑上是正确的,但我想用map来提高性能...... – johannix 2010-06-08 19:26:01

+0

我不认为你可以挤得太多更多的表现。如果你想对其进行并行化,那么由于GIL,你将无法使用Python来完成它。 – carl 2010-06-08 19:27:30

7

切片分配往往是确定的,如果你需要的地方进行修改列表

mylist[:] = map(func, mylist)