¿Cómo eliminar subcadenas específicas de un conjunto de cadenas en Python?

4 minutos de lectura

avatar de usuario
dominante

Tengo un conjunto de cadenas y todas las cadenas tienen una de dos subcadenas específicas que quiero eliminar:

set1 = {'Apple.good', 'Orange.good', 'Pear.bad', 'Pear.good', 'Banana.bad', 'Potato.bad'}

Quiero el “.good” y “.bad” subcadenas eliminadas de todas las cadenas. Intenté esto:

for x in set1:
    x.replace('.good', '')
    x.replace('.bad', '')

pero parece que no funciona, set1 queda exactamente igual. Traté de usar for x in list(set1) en cambio, pero eso no cambia nada.

avatar de usuario
Reut Sharabani

Las cadenas son inmutables. str.replace crea un nuevo cuerda. Esto se indica en la documentación:

str.replace(old, new[, count])

devolver un Copiar de la cadena con todas las apariciones de subcadena antiguo reemplazado por nuevo. […]

Esto significa que debe reasignar el conjunto o volver a llenarlo (la reasignación es más fácil con un establecer la comprensión):

new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}

PD: si desea cambiar el prefijo o el sufijo de una cadena y está utilizando Pitón 3.9 o más reciente, use str.removeprefix() o str.removesuffix() en cambio:

new_set = {x.removesuffix('.good').removesuffix('.bad') for x in set1}

  • Nota: También funciona con una lista, simplemente use [...] en vez de {...}

    – Mo711

    25 de abril de 2021 a las 14:56


  • ¿Cuál es el punto de editar esta pregunta para actualizarla con str.removesuffix() para Python 3.9+ copiando la respuesta de @DineshKumar? Es más justo dejar que la gente acredite al autor de esa respuesta.

    – Divenex

    28 de junio a las 8:59

  • @divenex Volvería a editar y enlazaría a la respuesta de Dinesh en lugar de copiarla. Creo que es legítimo porque vive en la misma página, por lo que no es como un enlace que en realidad puede caducar fácilmente.

    – Reut Sharabani

    28 de junio a las 18:25


>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replace no cambio la cadena, devuelve una copia de la cadena con el reemplazo. No puede cambiar la cadena directamente porque las cadenas son inmutables.

Debe tomar los valores de retorno de x.replace y ponerlos en un nuevo conjunto.

  • Pero cuando recorro el conjunto de cadenas, ¿cómo puedo actualizar un nuevo conjunto? usando set_name.update? ¿Podrías mostrar eso?

    – dominante

    22 de mayo de 2016 a las 9:39

avatar de usuario
DineshKumar

En Pitón 3.9+ podrías eliminar el sufijo usando str.removesuffix('mysuffix'). De los documentos:

Si la cadena termina con el sufijo cuerda y eso sufijo no está vacío, vuelve string[:-len(suffix)]. De lo contrario, devuelve una copia de la cadena original.

Entonces puede crear un nuevo conjunto vacío y agregar cada elemento sin el sufijo:

set1  = {'Apple.good', 'Orange.good', 'Pear.bad', 'Pear.good', 'Banana.bad', 'Potato.bad'}

set2 = set()
for s in set1:
   set2.add(s.removesuffix(".good").removesuffix(".bad"))

O crea el nuevo conjunto usando una comprensión de conjunto:

set2 = {s.removesuffix(".good").removesuffix(".bad") for s in set1}
   
print(set2)

Producción:

{'Orange', 'Pear', 'Apple', 'Banana', 'Potato'}

¡Todo lo que necesitas es un poco de magia negra!

>>> a = ["cherry.bad","pear.good", "apple.good"]
>>> a = list(map(lambda x: x.replace('.good','').replace('.bad',''),a))
>>> a
['cherry', 'pear', 'apple']

avatar de usuario
cs95

Cuando hay varias subcadenas para eliminar, una opción simple y efectiva es usar re.sub con un patrón compilado que implica unir todas las subcadenas para eliminar usando la expresión regular OR (|) tubería.

import re

to_remove = ['.good', '.bad']
strings = ['Apple.good','Orange.good','Pear.bad']

p = re.compile('|'.join(map(re.escape, to_remove))) # escape to handle metachars
[p.sub('', s) for s in strings]
# ['Apple', 'Orange', 'Pear']

avatar de usuario
Vivek

Podrías hacer esto:

import re
import string
set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}

for x in set1:
    x.replace('.good',' ')
    x.replace('.bad',' ')
    x = re.sub('\.good$', '', x)
    x = re.sub('\.bad$', '', x)
    print(x)

avatar de usuario
Amín

# practices 2
str = "Amin Is A Good Programmer"
new_set = str.replace('Good', '')
print(new_set)

 

print : Amin Is A  Programmer

  • Hola Amin. Si bien este código puede responder a la pregunta, proporcionar contexto adicional sobre por qué y/o cómo este código responde a la pregunta mejora su valor a largo plazo. Cómo responder. Saludos cordiales.

    – Elletlar

    13 de noviembre de 2020 a las 11:26

  • Hola amigo, este código funciona con otros textos largos. así que incluso puede obtener su cadena de la entrada y encontrar el punto de texto …

    – Amín

    13 de noviembre de 2020 a las 12:10

  • Es una muy mala práctica cambiar el nombre de componentes como str.

    – Chris Collett

    1 abr 2021 a las 17:32

  • eso no es un conjunto.

    – Boris Verjovskiy

    15 abr 2021 a las 23:16


  • por qué eso no está establecido, pero sé que es cierto. Entonces, ¿cuál es tu problema en este código?

    – Amín

    16 de abril de 2021 a las 1:02

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad