Я должен искать в списке и заменить все вхождения одного элемента другим. Пока мои попытки в коде ни к чему не привели, как лучше всего это сделать?
Например, предположим, что мой список имеет следующие целые числа
>>> 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.
Ответы:
источник
Попробуйте использовать понимание списка и троичный оператор .
источник
a
правда? Я думаю, что OP хотелa
изменитьсяa
должен ли он изменяться, но (как показывает Алехья) тривиально обрабатывать любой случай при использовании понимания списка.a
то вам следует это сделатьa[:] = [4 if x==1 else x for x in a]
(обратите внимание на полный список фрагментов). Просто сделавa =
, создаст новый списокa
с другимid()
(личность) от оригиналаПонимание списков работает хорошо, и циклическое выполнение с помощью перечисления может сэкономить вам немного памяти (поскольку операция по существу выполняется на месте).
Там также функциональное программирование. Смотрите использование карты :
источник
lambda
иmap
считается непитонным.Если вам нужно заменить несколько значений, вы также можете использовать словарь:
источник
n
не найден вdic
?n
не найден. Надеюсь, ты не против. Вашеtry/except
решение не было хорошим.try-except
минимум на 50% быстрее! Взгляните на этот ответif n in dic.keys()
плохая производительность. Использоватьif n in dic
илиdic.get(n,n)
(значение по умолчанию)источник
Вы можете использовать цикл for и or while; однако если вы знаете встроенную функцию Enumerate, то рекомендуется использовать Enumerate. 1
источник
Чтобы легко заменить все
1
с10
вa = [1,2,3,4,5,1,2,3,4,5,1]
один можно использовать следующий однострочный комбинацию лямбда + карты, и "Смотри, мама, нет IfS или Форс! :# This substitutes all '1' with '10' in list 'a' and places result in list 'c':
c = list(map(lambda b: b.replace("1","10"), a))
источник
lambda
каждый элемент списка ...Ниже приведен очень прямой метод в Python 2.x
Этот метод работает. Комментарии приветствуются. Надеюсь, поможет :)
Также попытайтесь понять, как работают решения outis и damzam . Сжатия списков и лямбда-функции являются полезными инструментами.
источник
В длинных списках и редких случаях использование примерно в 3 раза быстрее
list.index()
- по сравнению с одношаговыми итерационными методами, представленными в других ответах.источник
Я знаю, что это очень старый вопрос, и существует множество способов сделать это. Более простой, который я нашел, использует
numpy
пакет.источник
Мой вариант использования был заменен
None
некоторым значением по умолчанию.Я рассчитал подходы к этой проблеме, которые были представлены здесь, в том числе @kxr - using
str.count
.Тестовый код в ipython с Python 3.8.1:
Я получил:
Использование внутреннего
str.index
на самом деле быстрее, чем любое ручное сравнение.Я не знал, будет ли исключение в тесте 4 более трудоемким, чем использование
str.count
, разница кажется незначительной.Обратите внимание, что
map()
(тест 6) возвращает итератор, а не фактический список, таким образом, тест 7.источник
Вы можете просто использовать понимание списка в python:
для вашего случая, когда вы хотите заменить все вхождения 1 на 10, фрагмент кода будет выглядеть так:
источник
Найти и заменить только один предмет
источник