Как удалить все повторения символа в списке или строке в Python

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

Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU

Оглавление

  1. Удаление одного элемента методом pop()
  2. Удаление символа методом remove()
  3. Удаление всех повторений символа из списка
    3.1. С помощью понимания списка
    3.2. Методом remove()
    3.3. Функцией filter()
  4. Удаление всех вхождений символа из строки
    4.1. Циклом for Loop
    4.2. С помощью понимания списка
    4.3. Методом split()
    4.4. Функцией filter()
    4.5. Методом replace()
    4.6. Методом translate()
    4.7. С помощью регулярных выражений
  5. Заключение

Удаление одного элемента из списка с помощью метода pop()

Удалить отдельный элемент в списке можно с помощью метода pop(): при вызове он стирает последний символ. После выполнения удаленный элемент возвращается. На примере это выглядит так.

myList = [1, 2, 3, 4, 5, 6, 7]
print("The original list is:", myList)
x = myList.pop()
print("The popped element is:", x)
print("The modified list is:", myList)

Вывод:

The original list is: [1, 2, 3, 4, 5, 6, 7]
The popped element is: 7
The modified list is: [1, 2, 3, 4, 5, 6]

В поле вывода видно, что после выполнения метода pop() последний элемент списка (число 7) был удален.

Однако, если входной список пуст, программа столкнется с ошибкой IndexError. Это означает, что вы пытаетесь извлечь элемент из пустого списка. Приведем пример.

myList = []
print("The original list is:", myList)
x = myList.pop()
print("The popped element is:", x)
print("The modified list is:", myList)

Вывод:

The original list is: []
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/string12.py", line 3, in <module>
    x = myList.pop()
IndexError: pop from empty list

В поле вывода программа сообщает о проблеме с сообщением "IndexError: pop from empty list".

Еще один способ использования метода pop() — удаление элемента с определенным индексом. Вызывая метод на списке, в качестве входного аргумента нужно указать индекс элемента, который необходимо удалить. После выполнения элемент с заданным индексом будет убран и возвращен. Это хорошо видно на примере ниже.

myList = [1, 2, 3, 4, 5, 6, 7, 8]
print("The original list is:", myList)
x = myList.pop(3)
print("The popped element is:", x)
print("The modified list is:", myList)

Вывод:

The original list is: [1, 2, 3, 4, 5, 6, 7, 8]
The popped element is: 4
The modified list is: [1, 2, 3, 5, 6, 7, 8]

Элемент с индексом 3 (цифра 4) удален из списка с помощью метода pop().

Удаление элемента из списка с помощью метода remove()

Если вы не знаете индекс элемента, который нужно удалить, можно воспользоваться методом remove(). В случае вызова метода для списка он принимает элемент, который нужно убрать, в качестве входного аргумента. После выполнения метод remove() удаляет из списка первое вхождение указанного элемента. Этот метод не возвращает никакого значения, кроме None.

myList = [1, 2, 3, 4, 3, 5, 3, 6, 7, 8]
print("The original list is:", myList)
myList.remove(3)
print("The modified list is:", myList)

Вывод:

The original list is: [1, 2, 3, 4, 3, 5, 3, 6, 7, 8]
The modified list is: [1, 2, 4, 3, 5, 3, 6, 7, 8]

На примере видно, что после выполнения метода remove() из списка удаляется первое вхождение числа 3.

Если значение, указанное во входном аргументе метода remove(), отсутствует в списке, программа столкнется с исключением ValueError.

myList = []
print("The original list is:", myList)
myList.remove(3)
print("The modified list is:", myList)

Вывод:

The original list is: []
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/string12.py", line 3, in <module>
    myList.remove(3)
ValueError: list.remove(x): x not in list

Разберем пример выше. Так как список пуст, число 3 не может быть элементом списка. Поэтому, когда мы вызываем метод remove(), программа сталкивается с исключением ValueError с сообщением "ValueError: list.remove(x): x not in list".

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

Удаление всех повторений символа из списка

Удалить все одинаковые значения одного элемента из списка можно с помощью цикла for и метода append(). Для этого нужно выполнить следующие действия.

  • Сначала создается пустой список с именем outputList. Можно использовать либо квадратные скобки, либо конструктор list().
  • После создания outputList входной список символов нужно обойти с помощью цикла for.
  • Во время обхода элементов списка проходит проверка, нужно ли удалять текущий символ.
  • Если да, происходит переход к следующему символу с помощью оператора continue. В противном случае текущий символ добавляется в outputList с помощью метода append().

После выполнения цикла for выводится выходной список символов в outputList. Там будут присутствовать все символы, кроме тех, которые были удалены.

myList = ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
print("The original list is:", myList)
outputList = []
charToDelete = 'c'
print("The character to be removed is:", charToDelete)
for character in myList:
    if character == charToDelete:
        continue
    outputList.append(character)
print("The modified list is:", outputList)

Вывод:

The original list is: ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
The character to be removed is: c
The modified list is: ['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']

Удаление всех повторений символа из списка с помощью понимания списка

Еще один способ удаления всех вхождений заданного элемента — понимание списка и оператор членства 'in' .

Оператор in – это бинарный оператор, который принимает элемент в качестве первого операнда, и объект-контейнер, например, список, в качестве второго операнда. После выполнения он возвращает True, если элемент присутствует в объекте-контейнере. В противном случае он возвращает False.

myList = [1, 2, 3, 4,3, 5,3, 6, 7, 8]
print("The list is:", myList)
print(3 in myList)
print(1117 in myList)

Вывод:

The list is: [1, 2, 3, 4, 3, 5, 3, 6, 7, 8]
True
False

Используя понимание списка и оператор 'in', можно создать новый список, содержащий все символы, кроме тех, которые нужно удалить из исходного списка, как показано в следующем примере.

myList = ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
print("The original list is:", myList)
charToDelete = 'c'
print("The character to be removed is:", charToDelete)
outputList = [character for character in myList if character != charToDelete]
print("The modified list is:", outputList)

Вывод:

The original list is: ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
The character to be removed is: c
The modified list is: ['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']

Удаление всех повторений элемента из списка с помощью метода remove()

Можно удалить все нужные одинаковые символы из исходного списка, не создавая новый. Для этого используется метод remove() и оператор членства 'in'

Таким образом, мы получим выходной список, изменив исходный список, как показано ниже.  

  • Чтобы удалить все экземпляры заданного элемента, вначале производится проверка, присутствует ли символ в списке. Для этого используется оператор 'in'. Если нужный элемент найден, он удаляется с помощью метода remove. 
  • Для многократной проверки наличия символа используется цикл while.
  • После удаления всех вхождений заданного символа программа выйдет из цикла while.
myList = ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
print("The original list is:", myList)
charToDelete = 'c'
print("The character to be removed is:", charToDelete)
while charToDelete in myList:
    myList.remove(charToDelete)
print("The modified list is:", myList)

Вывод:

The original list is: ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
The character to be removed is: c
The modified list is: ['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']

Удаление всех повторений символа с помощью функции filter()

Для удаления всех вхождений символа из списка также можно использовать функцию filter().

В качестве первого входного аргумента она принимает другую функцию, например, myFun, а в качестве второго аргумента – объект-контейнер, например, список. Здесь myFun должна принимать элемент объекта-контейнера в качестве входного аргумента. После выполнения она должна вернуть либо True, либо False.

Если вывод myFun равен True для любого элемента объекта-контейнера, заданного во входных данных, то этот элемент включается в вывод. В противном случае элементы туда не попадут.

Чтобы удалить все вхождения в список нужного элемента с помощью метода filter(), надо выполнить следующие действия.

  • Сначала мы определим функцию myFun, которая принимает символ в качестве входного аргумента. Она возвращает False, если входной символ равен символу, который нам нужно удалить. В противном случае она должна возвращать True.
  • После определения myFun мы передадим ее в качестве первого аргумента, а список символов – в качестве второго входного аргумента функции filter().
  • После выполнения функция filter() вернет объект iterable, содержащий символы, которые не были удалены из списка.
  • Чтобы преобразовать объект iterable в список, мы передадим объект iterable в конструктор list(). Таким образом, мы получим список после удаления всех вхождений нужного символа.
def myFun(character):
    charToDelete = 'c'
    return charToDelete != character


myList = ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
print("The original list is:", myList)
charToDelete = 'c'
print("The character to be removed is:", charToDelete)
outputList=list(filter(myFun,myList))
print("The modified list is:", outputList)

Вывод:

The original list is: ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
The character to be removed is: c
The modified list is: ['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']

Вместо определения функции myFun мы можем создать лямбда-функцию и передать ее в filter() для удаления всех экземпляров символа из списка. Это можно сделать так.

myList = ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
print("The original list is:", myList)
charToDelete = 'c'
print("The character to be removed is:", charToDelete)
outputList = list(filter(lambda character: character != charToDelete, myList))
print("The modified list is:", outputList)

Вывод:

The original list is: ['p', 'y', 'c', 't', 'c', 'h', 'o', 'n', 'f', 'c', 'o', 'r', 'b', 'e', 'g', 'c', 'i', 'n', 'n', 'c', 'e', 'r', 's']
The character to be removed is: c
The modified list is: ['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']

Из приведенных выше примеров понятно, как разными способами можно удалить вхождения символа из списка. Ниже рассмотрим, как проделать то же самое в строке.

Удаление всех вхождений символа из строки в Python

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

Удаление всех вхождений символа из строки в Python с помощью цикла for Loop

Чтобы удалить все вхождения определенного символа из строки с помощью цикла for, нужно выполнить следующее.

  • Сначала создается пустая строка с именем outputString для хранения выходной строки.
  • После этого идет перебор символов исходной строки.
  • В процессе итерации по символам строки, если найден символ, подлежащий удалению, происходит переход к следующему символу с использованием оператора continue.
  • В противном случае конкатенируется текущий символ в outputString

После итерации до последнего символа строки с помощью цикла for с использованием описанных выше шагов появится выходная строка в новой строке с именем outputString.

myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
outputString = ""
for character in myStr:
    if character == charToDelete:
        continue
    outputString += character

print("The modified string is:", outputString)

Вывод:

The original string is: pyctchonfcorbegcinncers
The character to delete: c
The modified string is: pythonforbeginners

Удаление всех вхождений символа из строки в Python с помощью понимания списка

Вместо использования цикла for можно удалить вхождения определенного значения из заданной строки, используя метод list comprehension и join().

  • Сначала, используя понимание списка, создается список символов строки, которые не нужно удалять.
myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
myList = [character for character in myStr if character != charToDelete]
print("The list of characters is:")
print(myList)

Вывод:

The original string is: pyctchonfcorbegcinncers
The character to delete: c
The list of characters is:
['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']
  • После получения списка мы будем использовать метод join() для создания выходного списка. Этот метод при вызове на специальном символе принимает в качестве входного аргумента объект iterable, содержащий символы или строки. После выполнения он возвращает строку. Выходная строка содержит символы входного итерируемого объекта, разделенные специальным символом, на котором был вызван метод join.
  • В качестве специального символа мы будем использовать пустой символ "". Вызовем метод join() на пустом символе со списком, полученным на предыдущем шаге, в качестве входного аргумента. После выполнения метода join() получим желаемую выходную строку.
myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
myList = [character for character in myStr if character != charToDelete]
print("The list of characters is:")
print(myList)
outputString = "".join(myList)
print("The modified string is:", outputString)

Вывод:

The original string is: pyctchonfcorbegcinncers
The character to delete: c
The list of characters is:
['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']
The modified string is: pythonforbeginners

Удаление всех вхождений символа из строки в Python с помощью метода split()

Для удаления всех вхождений символа из заданной строки можно использовать метод split(). Когда этот метод вызывается для строки, то принимает в качестве входного аргумента разделитель. После выполнения split() возвращает список подстрок, разбитых разделителем.

Чтобы удалить все вхождения заданного символа из заданной строки, надо выполнить следующее.

  • Сначала вызывается метод split() для исходной строки. В качестве входного аргумента передается символ, который должен быть удален. Результат метода split() сохраняется в myList.
  • После получения myList на пустой строке вызывается метод join() с myList в качестве входного аргумента.
  • В результате получается желаемый результат. Сохраняем его в переменной outputString.
myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
myList = myStr.split(charToDelete)
print("The list is:")
print(myList)
outputString = "".join(myList)
print("The modified string is:", outputString)

Вывод:

The character to delete: c
The list is:
['py', 't', 'honf', 'orbeg', 'inn', 'ers']
The modified string is: pythonforbeginners

Удаление всех повторений символа из строки в Python с помощью функции filter()

Еще один вариант для удаления вхождений символа из строки — использовать функцию filter() с методом join() и лямбда-функцией.

Функция filter() принимает другую функцию, например, myFun, в качестве первого входного аргумента, и итерируемый объект, например, строку, в качестве второго входного аргумента. Здесь myFun должна принимать в качестве входного аргумента символ объекта string. После выполнения она должна вернуть либо True, либо False

Если вывод myFun равен True для любого символа строкового объекта, заданного на входе, то этот символ включается в вывод.

Чтобы удалить все вхождения нужного символа в строку, необходимо сделать следующее.

  • Сначала определим функцию myFun, которая принимает символ в качестве входного аргумента. Она возвращает False, если входной символ равен символу, который нужно удалить. В противном случае она должна возвращать True.
  • После определения myFun она передается в функцию filter() в качестве первого аргумента, а строка — в качестве второго входного аргумента.
  • После выполнения функция filter() вернет объект iterable, содержащий символы, которые не были удалены из строки.
  • Далее создается список символов с помощью передачи конструктору list() объекта iterable.
  • Получив список символов, можно создать выходную строку. Для этого на пустой строке со списком символов в качестве входного аргумента вызывается метод join() .
  • После выполнения метода join() получается нужная строка.  
def myFun(character):
    charToDelete = 'c'
    return charToDelete != character


myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
myList = list(filter(myFun, myStr))
print("The list is:")
print(myList)
outputString = "".join(myList)
print("The modified string is:", outputString)

Вывод:

The original string is: pyctchonfcorbegcinncers
The character to delete: c
The list is:
['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']
The modified string is: pythonforbeginners

Также для удаления всех экземпляров символа из строки вместо определения функции myFun можно создать эквивалентную лямбда-функцию и передать ее в filter() .

myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
myList = list(filter(lambda character: character != charToDelete, myStr))
print("The list is:")
print(myList)
outputString = "".join(myList)
print("The modified string is:", outputString)

Вывод:

The original string is: pyctchonfcorbegcinncers
The character to delete: c
The list is:
['p', 'y', 't', 'h', 'o', 'n', 'f', 'o', 'r', 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'r', 's']
The modified string is: pythonforbeginners

Удаление всех повторений символа из строки в Python с помощью метода replace()

Метод replace(), вызываемый для строки, принимает в качестве первого аргумента символ, который нужно заменить. Во втором аргументе он принимает символ, который заменит исходный, указанный в первом аргументе.

После выполнения метод replace() возвращает копию строки, заданной в качестве входной. В выходной строке все символы заменяются на новый.

Например, чтобы удалить все вхождения заданного символа из строки, вызовем метод replace(). В качестве первого входного аргумента передается символ, который нужно удалить. Во втором входном аргументе передадим пустую строку.

После выполнения все вхождения символа будут заменены пустой строкой. Значит, нужный символ был удален.

myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
outputString = myStr.replace(charToDelete, "")
print("The modified string is:", outputString)

Вывод:

The original string is: pyctchonfcorbegcinncers
The character to delete: c
The modified string is: pythonforbeginners

Удаление всех повторений символа из строки в Python с помощью метода translate()

Для удаления символов из строки также можно использовать метод translate(). В случае вызова для строки он принимает таблицу перевода в качестве входного аргумента. После выполнения translate() возвращает измененную строку в соответствии с таблицей перевода.

Таблица перевода может быть создана с помощью метода maketrans(). Этот метод, вызываемый для строки, принимает в качестве первого аргумента символ, который необходимо заменить, а в качестве второго – новый символ. После выполнения он возвращает таблицу перевода.

  • Сначала вызовем метод maketrans() для входной строки. В качестве первого входного аргумента передадим символ, который необходимо удалить, а в качестве второго – символ пробела. Нельзя передать методу maketrans() пустой символ, чтобы он сопоставил его с пустой строкой. Это связано с тем, что длина обоих аргументов строк должна быть одинаковой. В противном случае метод maketrans() столкнется с ошибкой.
  • После выполнения метод maketrans() вернет таблицу перевода, в которой символ, который нужно удалить, сопоставлен с символом пробела.
  • Получив таблицу перевода, вызовем метод translate() на входной строке с таблицей перевода в качестве входного аргумента.
  • После выполнения метод translate() вернет строку, где символы, которые нужно удалить, заменены символами пробела.
  • Чтобы удалить из строки символы пробела, вызовем метод split() на выходе метода translate(). После этого получим список подстрок.
  • Теперь вызовем метод join() на пустой строке. Здесь передадим список подстрок в качестве входных данных для метода join().
  • После выполнения метода join() получим нужную строку.
myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
translationTable = myStr.maketrans(charToDelete, " ")
outputString = "".join(myStr.translate(translationTable).split())
print("The modified string is:", outputString)

Вывод:

The original string is: pyctchonfcorbegcinncers
The character to delete: c
The modified string is: pythonforbeginners

Удаление всех вхождений символа из строки в Python с помощью регулярных выражений

Использование регулярных выражений — один из наиболее эффективных способов манипулирования строками или текстовыми данными.

Чтобы удалить символ из строки, можно использовать метод sub(), определенный в модуле re. Метод sub() принимает в качестве первого входного аргумента символ, который необходимо заменить, скажем, old_char. В качестве второго входного аргумента он принимает новый символ — new_char, а в качестве третьего – входную строку. После выполнения sub() заменяет old_char на new_char во входной строке и возвращает новую строку.

  • В качестве первого входного аргумента old_char в метод sub() передадим символ, который нужно удалить.
  • В качестве второго аргумента new_char передадим пустую строку.
  • В качестве третьего аргумента методу sub() передадим входную строку.

После выполнения метод sub() вернет новую строку, где символ, который нужно удалить, будет заменен символом пустой строки. Таким образом, мы получим желаемую выходную строку.

import re

myStr = "pyctchonfcorbegcinncers"
print("The original string is:", myStr)
charToDelete = 'c'
print("The character to delete:", charToDelete)
outputString = re.sub(charToDelete, "", myStr)
print("The modified string is:", outputString)

Вывод:

The original string is: pyctchonfcorbegcinncers
The character to delete: c
The modified string is: pythonforbeginners

Заключение

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

Спасибо, что прочитали. Успешного кодинга!

Перевод статьи Aditya Raj Remove All Occurrences of a Character in a List or String in Python”

1 комментарий к “Как удалить все повторения символа в списке или строке в Python”

  1. Пингбэк: Как посчитать количество вхождений символа в строку - pythonturbo

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *