Python: замена значений в строковых и списочных структурах

Раздел: Основы Python -> Манипуляции со строками и списками

Замена элементов в строках и списках одна из частых операций при обработке данных. В Python существуют несколько способов выполнить такую замену, каждый из которых подходит для определённой ситуации. В этой статье рассматриваются основные методы, их варианты и возможные проблемы.

Замена символов и подстрок в строках

Как проще всего заменить подстроку в строке?

Самый straightforward способ метод str.replace(old, new[, count]). Он возвращает новую строку, в которой все вхождения подстроки old заменены на new. Исходная строка остаётся неизменной, так как строки в Python immutable.

text = 'Hello World'
new_text = text.replace('World', 'Python')
print(new_text)

Python строка заменить (замена элементов в python (строках и списках))

Hello Python

Типичная ошибка попытка изменить строку без присваивания результата: text.replace('a','b') без сохранения. Решение: всегда присваивать результат новой переменной или той же.

Как заменить только первые несколько вхождений?

Метод replace принимает третий аргумент count, ограничивающий количество замен.

text = 'a a a a'
result = text.replace('a', 'b', 2)
print(result)
b b a a

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

Если необходимо заменить не фиксированную подстроку, а символы по некоторому правилу (например, все цифры на 'X'), можно использовать генератор списка или цикл.

text = 'abc123def'
result = ''.join('X' if ch.isdigit() else ch for ch in text)
print(result)
abcXXXdef

Этот подход также подходит для замены с более сложной логикой.

Как заменить несколько различных символов одновременно?

Для замены набора символов удобно использовать str.maketrans и str.translate. Например, заменить все гласные латинские буквы на '*'.

text = 'Hello World'
table = str.maketrans('aeiou', '*****')
print(text.translate(table))
H*ll* W*rld

Важно: длины строк в maketrans должны совпадать. Если нужно удалить символы, передают третий аргумент.

Как заменить по шаблону или с игнорированием регистра?

Модуль re предоставляет функцию re.sub(pattern, repl, string, count=0, flags=0). Это мощный инструмент для замены по регулярным выражениям.

import re
text = 'Hello World hello'
result = re.sub(r'hello', 'Hi', text, flags=re.IGNORECASE)
print(result)
Hi World Hi

Частая ошибка некорректное экранирование специальных символов. Для простой замены лучше использовать replace, так как re.sub медленнее и сложнее.

Замена элементов в списках

Как заменить один элемент списка по его позиции?

Списки изменяемы, поэтому можно напрямую присвоить новое значение по индексу.

lst = [1, 2, 3]
lst[1] = 99
print(lst)
[1, 99, 3]

Возникает ошибка IndexError, если индекс выходит за границы списка. Перед заменой рекомендуется проверять длину: if index < len(lst): lst[index] = value.

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

Срез списка позволяет заменить целый диапазон значений на другое количество элементов.

lst = [1, 2, 3, 4, 5]
lst[1:4] = [10, 20]
print(lst)
[1, 10, 20, 5]

Заменяемые элементы удаляются, а новый список вставляется на их место. Длина может измениться.

Как заменить элементы, удовлетворяющие условию, без циклов?

Генератор списка (list comprehension) создаёт новый список, заменяя элементы по условию. Это функциональный подход.

lst = [1, 2, 3, 4, 5]
new_lst = [0 if x % 2 == 0 else x for x in lst]
print(new_lst)
[1, 0, 3, 0, 5]

Важно: создаётся новый список, исходный не изменяется.

Как заменить элементы с изменением по индексу?

Если необходимо заменить элементы, учитывая их индекс, используется enumerate в цикле или в генераторе.

lst = [10, 20, 30, 40]
for i, val in enumerate(lst):
    if val > 25:
        lst[i] = 0
print(lst)
[10, 20, 0, 0]

Изменение происходит в исходном списке.

Как заменить элемент, если известны его значение или условие, но не индекс?

Можно сначала найти индекс через .index(), а затем присвоить. Метод .index() находит первое вхождение.

lst = ['a', 'b', 'c', 'b']
idx = lst.index('b')
lst[idx] = 'B'
print(lst)
['a', 'B', 'c', 'b']

Если значение отсутствует, возникает ValueError. Следует использовать проверку if value in lst или обработать исключение.

Расширенные примеры замены

Замена с помощью re.sub и группировок

Регулярные выражения позволяют захватывать части строки и использовать их в замене.

Пример
import re
text = '2023-04-12'
result = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', text)
print(result)
12/04/2023

Замена в списке с преобразованием типов

Заменить все строковые представления чисел на целые числа.

Пример
lst = ['1', '2', '3']
new_lst = [int(x) for x in lst]
print(new_lst)
[1, 2, 3]

Замена в многомерном списке (список списков)

Замена элементов во вложенных списках требует вложенного обхода.

Пример
matrix = [[1, 2], [3, 4]]
for row in matrix:
    for i in range(len(row)):
        if row[i] % 2 == 0:
            row[i] = 0
print(matrix)
[[1, 0], [3, 0]]

Замена с помощью map и lambda

Функция map применяет функцию к каждому элементу, возвращая итератор. Можно использовать для замены без явного цикла.

Пример
lst = [1, 2, 3, 4]
new_lst = list(map(lambda x: x*10 if x > 2 else x, lst))
print(new_lst)
[1, 2, 30, 40]

Замена с использованием slicing для замены части списка на другой список разной длины

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

Пример
lst = [1, 2, 3, 4, 5]
lst[1:4] = [100, 200, 300, 400]  # вставляем 4 элемента на место 3
print(lst)
[1, 100, 200, 300, 400, 5]

Использование str.maketrans для замены с удалением символов

Третий аргумент в maketrans позволяет указать символы, которые нужно удалить.

Пример
text = 'hello world!'
table = str.maketrans('', '', 'aeiou')
print(text.translate(table))
hll wrld!

Замена элементов в Python (строках и списках) - comments

En
Python строка заменить (python)