2013-04-15 182 views
0

我正在嘗試爲列表列表創建一個自定義轉換。我試圖在子列表上運行算術運算,但我不成功。這裏是我的代碼:帶列表參數的映射函數

def my_transform(seq): 
    new_seq = [] 
    new_seq[0] = seq[0] + 100 
    new_seq[1] = seq[1] - 1 
    new_seq[2] = seq[2] * seq[2] 
    return new_seq 

my_list = [[1,2,3], [4,5,6]] 

new_list = map(my_transform, my_list) # error 
# ideal output: 
#[[101,1,9], [104,4,36]] 

,但我得到了以下錯誤:

Traceback (most recent call last): 
File "<pyshell#9>", line 1, in <module> 
map(my_transform,my_list) 
File "<pyshell#7>", line 3, in my_transform 
new_seq[0] = seq[0] + 100 
IndexError: list assignment index out of range 

我也試過:

[my_transform(L) for L in my_list] 

這給了我同樣的錯誤了。如何使用地圖和/或列表理解來獲得結果?謝謝!

保羅

回答

4

的問題是在你的函數。

new_seq[0]試圖引用列表的第一個元素,但它不在那裏,所以它給出了錯誤。爲了解決這個問題,我們可以將new_seq作爲原始列表的長度,或者使用append,但更簡單的解決方案是更改函數,使其根本不使用中間列表。

def my_transform(seq): 
    return [seq[0] + 100, seq[1] - 1, seq[2] * seq[2]] 

如果我們嘗試這個功能,我們可以看到它的工作原理。

>>> my_list = [[1,2,3], [4,5,6]] 
>>> map(my_transform, my_list) 
[[101, 1, 9], [104, 4, 36]] 
+1

做得好指出沒有必要的像這樣的新名單。 – squiguy

2

的問題是,你的新列表開始是空的,這就是爲什麼你會得到索引錯誤試圖訪問不存在的項目,我已經與佔位符填充它0 s到解決這個問題:

>>> my_list = [[1,2,3], [4,5,6]] 
>>> def my_transform(seq): 
     new_seq = [0] * len(seq) 
     new_seq[0] = seq[0] + 100 
     new_seq[1] = seq[1] - 1 
     new_seq[2] = seq[2] * seq[2] 
     return new_seq 

>>> map(my_transform, my_list) 
[[101, 1, 9], [104, 4, 36]] 

另外,您可以初始化到seq副本,像這樣:

new_seq = list(seq) 
+1

也'new_seq =序列[:]' –

2

這是因爲0,1和2不defiend的元素,你可以寫

def my_transform(seq): 
    new_seq = [] 
    new_seq.append(seq[0] + 100) 
    new_seq.append(seq[1] - 1) 
    new_seq.append(seq[2] * seq[2]) 
    return new_seq