2013-04-15 127 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