使用列表参数映射函数

时间:2013-04-15 04:07:10

标签: python python-2.7

我正在尝试为列表列表创建自定义转换。我试图在子列表上运行算术运算,但我没有成功。这是我的代码:

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]

这也给了我同样的错误。如何使用地图和/或列表理解获得结果?谢谢!

3 个答案:

答案 0 :(得分: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 :(得分:2)

问题是您的新列表开始为空,这就是为什么您尝试访问不存在的项时会出现索引错误的原因,我已用占位符0填充它以解决此问题:

>>> 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)

答案 2 :(得分:2)

这是因为没有定义元素0,1和2,你可以写

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