2014-09-03 236 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