Вопрос-Ответ

Finding and replacing elements in a list

Поиск и замена элементов в списке

Мне приходится выполнять поиск по списку и заменять все вхождения одного элемента другим. Пока мои попытки в коде ни к чему не приводят, как лучше всего это сделать?

Например, предположим, что мой список содержит следующие целые числа

a = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]

и мне нужно заменить все вхождения числа 1 значением 10, поэтому результат, который мне нужен, будет

a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]

Таким образом, моя цель - заменить все экземпляры числа 1 на число 10.

Переведено автоматически
Ответ 1

Попробуйте использовать понимание списка и условное выражение.

>>> a=[1,2,3,1,3,2,1,1]
>>> [4 if x==1 else x for x in a]
[4, 2, 3, 4, 3, 2, 4, 4]
Ответ 2

Вы можете использовать встроенную функцию enumerate для получения как индекса, так и значения при повторении списка. Затем используйте значение для проверки условия, а индекс - для замены этого значения в исходном списке:

>>> a = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
>>> for i, n in enumerate(a):
... if n == 1:
... a[i] = 10
...
>>> a
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
Ответ 3

Если у вас есть несколько значений для замены, вы также можете использовать словарь:

a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1]
replacements = {1:10, 2:20, 3:'foo'}
replacer = replacements.get # For faster gets.

print([replacer(n, n) for n in a])

> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10]

Обратите внимание, что этот подход работает, только если элементы, подлежащие замене, являются хэшируемыми. Это связано с тем, что ключи dict должны быть хэшируемыми.

Ответ 4

Понимание списка работает хорошо, и выполнение цикла с помощью enumerate может сэкономить вам немного памяти (поскольку операция, по сути, выполняется на месте).

Существует также функциональное программирование. Смотрите использование map:

>>> a = [1,2,3,2,3,4,3,5,6,6,5,4,5,4,3,4,3,2,1]
>>> map(lambda x: x if x != 4 else 'sss', a)
[1, 2, 3, 2, 3, 'sss', 3, 5, 6, 6, 5, 'sss', 5, 'sss', 3, 'sss', 3, 2, 1]
python list