2010-06-08 90 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)