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

3 回答 3

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]]
于 2013-04-15T04:10:40.987 回答
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)
于 2013-04-15T04:09:31.017 回答
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
于 2013-04-15T04:11:10.457 回答