我的脚本的以下两个版本按预期工作:
matrix = [[1, -2, 3], [-4, 5, -6], [7, -8, 9]]
def negate(amatrix):
for alist in matrix:
for i in range(len(alist)):
alist[i] = -alist[i]
return amatrix
print(negate(matrix))
收益率:[[-1,2,-3],[4,-5,6],[ - 7,8,-9]]
和这个版本一样:
matrix = [[1, -2, 3], [-4, 5, -6], [7, -8, 9]]
def negate(amatrix):
newmatrix = []
for alist in amatrix:
newlist = [-x for x in alist]
newmatrix.append(newlist)
return newmatrix
print(negate(matrix))
我正在尝试使用理解来更改值,就像第一个版本一样。
我有这个:
matrix = [[1, -2, 3], [-4, 5, -6], [7, -8, 9]]
def negate(amatrix):
for alist in matrix:
alist = [-x for x in alist]
return amatrix
print(negate(matrix))
第三个版本确实否定了每个列表中的各个值,但更改未保存在矩阵中,即我希望列表值发生变化。
有没有办法使用理解来否定各个列表值,或者我是否必须使用索引版本(上面的第一个版本)?
答案 0 :(得分:1)
列表推导不起作用。当您说x = [-i for i in x]
时,会先评估右侧并分配给x
。即使您将其分配给同一个变量,解决方案也不会就位。
您可能需要的是矢量化就地解决方案。这由numpy
支持:
import numpy as np
arr = np.array([[1, -2, 3], [-4, 5, -6], [7, -8, 9]])
arr *= -1
# array([[-1, 2, -3],
# [ 4, -5, 6],
# [-7, 8, -9]])