2014-09-03 240 views
0

如果值爲奇數或偶數,則假定更改列表的值。 錯誤:基於值奇數或偶數的Python更改列表元素

list assignment index out of range 

代碼:

def list_mangler(list_in): 
    for i in list_in: 
     if i % 2 == 0: 
      list_in[i] = i * 2 
     else: 
      list_in[i] = i * 3 
    return list_in 



list_mangler([1, 2, 3, 4]) 

回答

4

問題是for i in list_in產量項目在列表中,而不是指數。要獲得指數,使用enumerate

for i, val in enumerate(list_in): 
    if i % 2 == 0: 
     list_in[i] = val * 2 
    ... 

如果你想返回列表(而不是突變的舊列表),列表理解與條件表達式可以很好地做到:

[val * 3 if val % 2 else val * 2 for val in list_in] 

當然,你可以使用這個與片分配變異list_in如果你真的需要:

list_in[:] = [val * 3 if val % 2 else val * 2 for val in list_in] 

作爲一種風格,如果你的函數的目的是修改列表,不要返回列表。這表明輸入發生了變化,而不是返回由原始數據構建的新列表。

+0

因此,我應該將修改後的列表作爲新列表存儲,而不是返回原始列表?只是爲了更具可讀性? – 2014-09-03 17:40:53

+0

@DakotaJones - 如果一個方法返回'None',除非它有副作用(例如寫入文件系統),或者它改變了輸入參數,否則它是沒有用的。如果一個方法返回_something else,那麼它通常被認爲是它執行的唯一動作。所以,如果您修改了原始列表,請不要返回任何內容。如果你根據舊列表的內容創建一個新列表,那就是返回內容的時間。 – mgilson 2014-09-03 18:10:35

0

您需要使用enumerate,因爲for i in list返回的元素不是索引。

for index, val in enumerate(list_in): 
     if val % 2 == 0: 
      list_in[index] = val* 2 
     else: 
      list_in[index] = val * 3 
    return list_in 
+0

@MartijnPieters完成。 – levi 2014-09-03 16:36:01