Установить отрицательные индексы в списке на ноль - PullRequest
0 голосов
/ 13 марта 2019

Следующая функция помещается в цикл 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?

Ответы [ 5 ]

3 голосов
/ 13 марта 2019

Вы можете заключить извлечение в функцию,

def get_or_zero(array, i, j):
    try:
        return array[i][j]
    except IndexError:
        return 0

, тогда вы можете использовать get_or_zero(C_ki, i, j) вместо C_ki[i][j] в функции max.

1 голос
/ 13 марта 2019

Если вы хотите поместить индекс -7 только в том случае, если он существует, а в противном случае индекс 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])

Elif youхотите поставить индекс -7 только в том случае, если он существует, а в противном случае значение 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])

Подробнее о троичном операторе

0 голосов
/ 13 марта 2019

9 раз из десяти, лучше решить проблему с индексами, но, предполагая, что это в 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
0 голосов
/ 13 марта 2019

Примечание: вы получаете ошибку индекса, потому что индекс списка выходит за пределы диапазона (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

0 голосов
/ 13 марта 2019

Итак, если 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])
...