Как называется методика, в которой условное обозначение используется в индексе для списка, но переменная в условном выражении является самим списком? Как видите, a - это список, но он используется для проверки соответствующих элементов в списке b.

>>> a = [ 1, 2, 3]
>>> b = [7, 7,7]

>>> b[a==1] = 8

>>> b
[8, 7, 7]

Я писал код, используя массивы numpy, и думал о том, чтобы увидеть, есть ли в ядре Python такая же функция, и оказалось, что она существует. У меня просто не было возможности его искать, потому что я не имел ни малейшего представления о том, как это называется.

РЕДАКТИРОВАТЬ: Я хотел бы знать, что называется, а также объяснение того, что происходит, учитывая, что комментарии показывают, что код не делает то, что я думаю, что делает.

Для ясности и проработки, это код, который я ввел для numpy и получил замену, аналогичную списку Python.

>>> import numpy as np
>>> lower_green = np.array([0,180,0]) 
>>> upper_green = np.array([100,255,100])
>>> upper_green[lower_green == 0] = 7
>>> upper_green
array([  7, 255,   7])
0
heretoinfinity 27 Фев 2018 в 23:40

3 ответа

Лучший ответ

Деконструируя выражение, получаем:

  1. (False == 0) == True
  2. (a == 1) == False

Учитывая это, мы приходим к выводу, что

b[a == 1] == b[False] == b[0]
6
ForceBru 27 Фев 2018 в 20:56

a==1 имеет значение false, равное нулю

Это не то же самое, что использование массива логических значений в numpy [1]. (иногда называется логическим индексированием)

[ 1 ] https://docs.scipy.org/doc/ NumPy - 1.13.0 / пользователь / basics.indexing.html

1
ColonelFazackerley 27 Фев 2018 в 20:56

То, что вы хотите сделать, может быть достигнуто следующим образом (это не будет работать во всех случаях):

a = [ 1, 2, 3]
b = [7, 7, 7]
b[a.index(1)] = 8

output:
b = [8, 7, 7]

Однако метод index() возвращает только самый низкий индекс, если имеется несколько совпадающих элементов. Поэтому он не будет работать в следующем случае:

a = [0, 1, 1]
b = [7, 7, 7]
b[a.index(1)] = 8

output:
b = [7, 8, 7] and not [7, 8, 8]

Тем не менее, если вы хотите сделать это с помощью основного Python, то здесь все готово (воспользуйтесь помощью этого ответа):

# first get all the indices of the matching elements

a = [0, 1, 1]
b = [7, 7, 7]
to_match = 1
to_replace = 8

ind = [n for n,x in enumerate(a) if x == to_match]
for i in ind:
    b[i] = to_replace
1
Parag S. Chandakkar 27 Фев 2018 в 21:01