поиск и замена элементов в списке (python) - PullRequest
208 голосов
/ 06 апреля 2010

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

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

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

Ответы [ 9 ]

428 голосов
/ 06 апреля 2010

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

>>> 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]
200 голосов
/ 06 апреля 2010
>>> a= [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
>>> for n, i in enumerate(a):
...   if i == 1:
...      a[n] = 10
...
>>> a
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
28 голосов
/ 06 апреля 2010

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

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

>>> 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]
22 голосов
/ 11 июля 2016

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

a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1]
dic = {1:10, 2:20, 3:'foo'}

print([dic.get(n, n) for n in a])

> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10]
9 голосов
/ 06 апреля 2010
>>> a=[1,2,3,4,5,1,2,3,4,5,1]
>>> item_to_replace = 1
>>> replacement_value = 6
>>> indices_to_replace = [i for i,x in enumerate(a) if x==item_to_replace]
>>> indices_to_replace
[0, 5, 10]
>>> for i in indices_to_replace:
...     a[i] = replacement_value
... 
>>> a
[6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6]
>>> 
6 голосов
/ 31 января 2018
a = [1,2,3,4,5,1,2,3,4,5,1,12]
for i in range (len(a)):
    if a[i]==2:
        a[i]=123

Вы можете использовать цикл for и or while; однако если вы знаете встроенную функцию перечисления, то рекомендуется использовать перечисление. 1

3 голосов
/ 08 мая 2019

Легко заменить все 1 на 10 в a = [1,2,3,4,5,1,2,3,4,5,1] можно использовать комбинацию лямбда + карта и «Смотри, мама, без IF или FOR!» :

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

2 голосов
/ 02 марта 2017

Ниже приведен очень прямой метод в Python 2.x

 a = [1,2,3,4,5,1,2,3,4,5,1]        #Replacing every 1 with 10
 for i in xrange(len(a)):
   if a[i] == 1:
     a[i] = 10  
 print a

Этот метод работает.Комментарии приветствуются.Надеемся, что это поможетСжатия списков и лямбда-функции являются полезными инструментами.

1 голос
/ 23 мая 2018

Вы можете просто использовать понимание списка в python:

def replace_element(YOUR_LIST, set_to=NEW_VALUE):
    return [i
            if SOME_CONDITION
            else NEW_VALUE
            for i in YOUR_LIST]

для вашего случая, когда вы хотите заменить все вхождения 1 на 10, фрагмент кода будет выглядеть так:

def replace_element(YOUR_LIST, set_to=10):
    return [i
            if i != 1  # keeps all elements not equal to one
            else set_to  # replaces 1 with 10
            for i in YOUR_LIST]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...