Заменить все значения в списке без использования перечисления?

Скажем, я хотел найти все значения "6" в списке и заменить его значением "600". Я могу сделать это с помощью enumerate(), но я считаю, что это не очень хороший способ делать то, что я хочу. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно знать индекс, чтобы заменить значение новым, следовательно, DATA[idx] .

DATA = [ 2,4,6,8,6,1,2,3,4,6]
      for idx, val in enumerate(DATA):
        if val == 6:
            DATA[idx]=600

Но есть ли альтернативный и / или более эффективный способ сделать это? Спасибо за ваше время.

4 ответа

Решение

Используйте понимание списка:

DATA = [2,4,6,8,6,1,2,3,4,6]
DATA = [600 if x == 6 else x for x in DATA]
print(DATA)
>> [2, 4, 600, 8, 600, 1, 2, 3, 4, 600]

РЕДАКТИРОВАТЬ: В соответствии с просьбой - Кстати, я не совсем уверен, что именно так Python реализует это в фоновом режиме, но вот глупая версия понимания:

>>>> DATA = [600 if x == 6 else x for x in DATA]
DATA2 = []
for x in DATA:
    if x == 6:
        DATA2.append(600)
    else:
        DATA2.append(x)
DATA = DATA2
del(DATA2)

Я не уверен, что вы подразумеваете под "более эффективным". Все, что вы можете сделать, это пройтись по массиву и рассмотреть каждое значение. Ваш код делает это адекватно. Я не вижу проблемы с этим.

Я могу придумать несколько других способов сделать это. Понимание списка очень компактно:

   DATA = [600 if i == 6 else i for i in DATA]

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

Ты можешь использовать range с len:

for i in range(len(DATA)):
    if DATA[i] == 6:
        DATA[i] = 600

или назначение среза:

DATA[:] = [600 if item == 6 else item for item in DATA]

enumerate наверное лучше.

Для вашей задачи лучше использовать логическую маску NumPy для очень быстрой и удобной замены на месте с помощью интуитивно понятной команды

                              data[data == 6] = 600

Полный код:

import numpy as np            # pip install numpy

DATA = [ 2,4,6,8,6,1,2,3,4,6]

data = np.array(DATA)         # converting to a NumPy array
data[data == 6] = 600         # data == 6 is a boolean mask; it is written in [] as an index

Выход из print(data):

 [  2   4 600   8 600   1   2   3   4 600]

Примечание 1:

Если вам нужно преобразовать полученный массив NumPy обратно в список Python, используйте data = list(data):

[2, 4, 600, 8, 600, 1, 2, 3, 4, 600]

Заметка 2:

Смущает использование имени DATA (все заглавные буквы) для чего-то, что вы позже измените -
см. PEP 8 - Руководство по стилю для кода Python и констант в нем.

Другие вопросы по тегам