Заменить все значения в списке без использования перечисления?
Скажем, я хотел найти все значения "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 и констант в нем.