将列表中的负索引设置为零
Set negative indices in list to zero
以下函数放在 for 循环中,由于 for 循环索引可以获得高负值,如下例所示:
C_ki[2][1] = max (C_ki[1][1], C_ki[3][-7] , C_ki[2][0])
# C_ki is defined as:
C_ki = [[0]*(7) for x in range(3)]
C_ik = [[0]*(3) for x in range(7)]
为了计算上面的C_ki[2][1]
,python给出了一个错误列表索引超出范围,因为负索引。
有没有办法将负索引的 C_ki[3][-7]
设置为零,或者不考虑 max 函数?
所以,如果 i
是你的(可能)负指数,你可以简单地做这样的事情
C_ki[2][1] = max (C_ki[1][1], C_ki[3][max(i,0)] , C_ki[2][0])
如果正如我所怀疑的那样,您希望将整个元素值设置为零,那么您可以使用条件语句
C_ki[2][1] = max (C_ki[1][1], 0 if i <0 else C_ki[3][i] , C_ki[2][0])
如果你只想在索引 -7
存在时放置索引,否则 index 0
,你可以使用三元运算符 :
C_ki[2][1] = max(C_ki[1][1], C_ki[3][-7 if len(C_ki[3]) >= 7 else 0] , C_ki[2][0])
如果您只想在索引 -7
存在时放置索引,否则 value 0
:
C_ki[2][1] = max(C_ki[1][1], C_ki[3][-7] if len(C_ki[3]) >= 7 else 0, C_ki[2][0])
More on the ternary operator
注意:您收到索引错误,因为列表索引超出范围 (C_ki[3][-7])
您的 C_ki 具有维度 [3][7],索引从 0 开始计数到 2。3 超出范围。
注意:负索引会发生什么:
示例:
array = [0,1,2,3,4,5]
print (array[-1]) # equal array[5]
结果:5
您可以将提取包装在一个函数中,
def get_or_zero(array, i, j):
try:
return array[i][j]
except IndexError:
return 0
那么你可以在 max 函数中使用 get_or_zero(C_ki, i, j)
而不是 C_ki[i][j]
。
十次中有九次最好用索引解决问题,但假设这是第 10 次,内置的 min、max 函数可以组合起来为您提供您正在寻找的保护类型:
# legal value, no change required
I= 2
D=(min(max(I,0),4))
# D will equal 2
# large negative set to zero
I= -7
D=(min(max(I,0),4))
# D will zero 0
# large positive set to the value of the maximum of 4
I= 7
D=(min(max(I,0),4))
# D will equal 4
以下函数放在 for 循环中,由于 for 循环索引可以获得高负值,如下例所示:
C_ki[2][1] = max (C_ki[1][1], C_ki[3][-7] , C_ki[2][0])
# C_ki is defined as:
C_ki = [[0]*(7) for x in range(3)]
C_ik = [[0]*(3) for x in range(7)]
为了计算上面的C_ki[2][1]
,python给出了一个错误列表索引超出范围,因为负索引。
有没有办法将负索引的 C_ki[3][-7]
设置为零,或者不考虑 max 函数?
所以,如果 i
是你的(可能)负指数,你可以简单地做这样的事情
C_ki[2][1] = max (C_ki[1][1], C_ki[3][max(i,0)] , C_ki[2][0])
如果正如我所怀疑的那样,您希望将整个元素值设置为零,那么您可以使用条件语句
C_ki[2][1] = max (C_ki[1][1], 0 if i <0 else C_ki[3][i] , C_ki[2][0])
如果你只想在索引 -7
存在时放置索引,否则 index 0
,你可以使用三元运算符 :
C_ki[2][1] = max(C_ki[1][1], C_ki[3][-7 if len(C_ki[3]) >= 7 else 0] , C_ki[2][0])
如果您只想在索引 -7
存在时放置索引,否则 value 0
:
C_ki[2][1] = max(C_ki[1][1], C_ki[3][-7] if len(C_ki[3]) >= 7 else 0, C_ki[2][0])
More on the ternary operator
注意:您收到索引错误,因为列表索引超出范围 (C_ki[3][-7])
您的 C_ki 具有维度 [3][7],索引从 0 开始计数到 2。3 超出范围。
注意:负索引会发生什么:
示例:
array = [0,1,2,3,4,5]
print (array[-1]) # equal array[5]
结果:5
您可以将提取包装在一个函数中,
def get_or_zero(array, i, j):
try:
return array[i][j]
except IndexError:
return 0
那么你可以在 max 函数中使用 get_or_zero(C_ki, i, j)
而不是 C_ki[i][j]
。
十次中有九次最好用索引解决问题,但假设这是第 10 次,内置的 min、max 函数可以组合起来为您提供您正在寻找的保护类型:
# legal value, no change required
I= 2
D=(min(max(I,0),4))
# D will equal 2
# large negative set to zero
I= -7
D=(min(max(I,0),4))
# D will zero 0
# large positive set to the value of the maximum of 4
I= 7
D=(min(max(I,0),4))
# D will equal 4