233 votes

Comment supprimer des sous-chaînes spécifiques d'un ensemble de chaînes de caractères en Python ?

J'ai un jeu de cordes set1 et toutes les chaînes de caractères dans set1 a deux sous-chaînes spécifiques dont je n'ai pas besoin et que je veux supprimer.
Entrée de l'échantillon : set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Donc, en gros, je veux que le .good y .bad sous-chaînes supprimées de toutes les chaînes.
Ce que j'ai essayé :

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

Mais cela ne semble pas fonctionner du tout. Il n'y a absolument aucun changement dans la sortie et elle est la même que l'entrée. J'ai essayé d'utiliser for x in list(set1) au lieu de l'original mais cela ne change rien.

265voto

Reut Sharabani Points 1353

Les chaînes de caractères sont immuables. str.replace crée un nouveau chaîne. Cela est indiqué dans la documentation :

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

Retourner un copie de la chaîne avec toutes les occurrences de la sous-chaîne vieux remplacé par nouveau . [...]

Cela signifie que vous devez réaffecter l'ensemble ou le repeupler (la réaffectation est plus facile avec un fichier compréhension de l'ensemble) :

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

1 votes

Note : Cela fonctionne également avec une liste, il suffit d'utiliser [...] au lieu de {...}

99voto

Alex Hall Points 20790
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replace n'a pas changement la chaîne, il renvoie une copie de la chaîne avec le remplacement. Vous ne pouvez pas modifier la chaîne de caractères directement, car les chaînes de caractères sont immuables.

Vous devez prendre les valeurs de retour de x.replace et les mettre dans un nouveau jeu.

0 votes

Mais lorsque je boucle sur l'ensemble des chaînes de caractères, comment puis-je mettre à jour un nouvel ensemble ? en utilisant set_name.update ? Pourriez-vous le montrer ?

16voto

gueeest Points 31

Tout ce dont vous avez besoin est un peu de magie noire !

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

5voto

Vivek Points 406

Tu pourrais faire ça :

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)

4 votes

Ligne x.replace('.good',' ') y x.replace('.bad',' ') ne change rien au résultat final. L'impression sera la même sans eux.

0 votes

Je préférerais également avoir une seule ligne avec re.sub comme ceci : x = re.sub('((\.good$)|(\.bad$))', '', x)

0 votes

@SranPopi ouais je suis d'accord avec vous

4voto

user140259 Points 69

J'ai fait le test (mais ce n'est pas votre exemple) et les données ne les renvoient pas de manière ordonnée ou complète.

>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = {x.replace('p','') for x in ind}
>>> newind
{'1', '2', '8', '5', '4'}

J'ai prouvé que cela fonctionne :

>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = [x.replace('p','') for x in ind]
>>> newind
['5', '1', '8', '4', '2', '8']

o

>>> newind = []
>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> for x in ind:
...     newind.append(x.replace('p',''))
>>> newind
['5', '1', '8', '4', '2', '8']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X