我正在尝试为列表列表创建自定义转换。我试图在子列表上运行算术运算,但我没有成功。这是我的代码:
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]
这也给了我同样的错误。如何使用地图和/或列表理解获得结果?谢谢!
保
答案 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