Заменить все значения в списке без использования перечисления? - PullRequest
0 голосов
/ 10 февраля 2019

Скажем, я хотел найти все значения «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 ]

0 голосов
/ 10 февраля 2019

Для вашей задачи лучше использовать 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 ичасть Константы в нем.

0 голосов
/ 10 февраля 2019

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

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

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

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

0 голосов
/ 10 февраля 2019

Вы можете использовать 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, вероятно, лучше всего.

0 голосов
/ 10 февраля 2019

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

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)
...