Как, не зная индекс, заменить произвольные элементы списка?

Одна из задач на обучающем курсе. Дан список:

lst = ['Anthony', 'is', 'complete', 'bastard.]

Требуется заменить элементы 'bastard.' на 'badass.' и вывести всё это дело. Конечно, на ум приходит что-то вроде:

lst[3] = 'badass'
print(lst)

Но что делать в том случае, если мне неизвестен индекс необходимой строки? Можно ли осуществить замену необходимых строк, если известно лишь их содержание?


Ответы (3 шт):

Автор решения: eri

Пройти по массиву целиком

lst = ['Anthony', 'is', 'complete', 'bastard']
lst = list(map(lambda x: 'badass' if x=='bastard' else x, lst ))
print(lst)

или поискать индексы

lst = ['Anthony', 'is', 'complete', 'bastard']
index = 0
while True:
    try:
        index = lst.index('bastard', index)
    except ValueError:
        break
    lst[index] = 'badass'
print(lst)

или списковые включение

lst = ['Anthony', 'is', 'complete', 'bastard']
lst = [('badass' if x=='bastard' else x) for x in lst ]
print(lst)
→ Ссылка
Автор решения: Sotnikov

Можно сделать это с помощью метода index, он возвращает индекс по указаному значению

То есть примерно так:

lst = ['Anthony', 'is', 'complete', 'bastard']
lst[lst.index('bastard')] = 'new_value'

В итоге у нас будет новый список с изменённым значением

Показ измененного списка

→ Ссылка
Автор решения: Danis
def replace(iterable, old, new, count=-1):
    if not isinstance(count, int):
        type_name = count.__class__.__name__
        msg = f'integer argument expected, got {type_name}'
        raise TypeError(msg)
    
    iterable = iter(iterable)
    for el in iterable:
        if count == 0:
            break
        
        if el == old:
            count -= 1
            yield new
        else:
            yield el
    
    yield from iterable
→ Ссылка