web-dev-qa-db-fra.com

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

J'ai un ensemble de chaînes set1, et toutes les chaînes de set1 ont deux sous-chaînes spécifiques que je n'ai pas besoin et que je veux supprimer.
Exemple d'entrée: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Je souhaite donc que les sous-chaînes .good et .bad soient 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 c'est la même chose que l'entrée. J'ai essayé d'utiliser for x in list(set1) au lieu de l'original, mais cela ne change rien.

99
controlfreak

Les cordes sont immuables. string.replace crée une nouvelle chaîne . Ceci est indiqué dans la documentation:

Renvoie une copie de la chaîne s en remplaçant toutes les occurrences de la sous-chaîne par new. ...

Cela signifie que vous devez réaffecter le jeu ou le re-peupler (réallouer est plus facile avec compréhension du jeu) :

_new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}
_
112
Reut Sharabani
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replace ne fait pas change la chaîne, il renvoie une copie de la chaîne avec le remplacement. Vous ne pouvez pas changer la chaîne directement car les chaînes sont immuables.

Vous devez prendre les valeurs de retour de x.replace et les placer dans un nouvel ensemble.

47
Alex Hall

Tout ce dont vous avez besoin, c'est d'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']
7
gueeest

Vous pourriez faire ceci:

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)
5
Vivek

J'ai fait le test (mais ce n'est pas votre exemple) et les données ne les renvoient pas correctement ni complètement.

>>> 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']

ou

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

Si liste

Je faisais quelque chose pour une liste qui est un ensemble de chaînes et vous voulez supprimer toutes les lignes qui ont une certaine sous-chaîne, vous pouvez le faire

import re
def RemoveInList(sub,LinSplitUnOr):
    indices = [i for i, x in enumerate(LinSplitUnOr) if re.search(sub, x)]
    A = [i for j, i in enumerate(LinSplitUnOr) if j not in indices]
    return A

sub est un motif que vous ne souhaitez pas inclure dans une liste de lignes LinSplitUnOr

par exemple

A=['Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad']
sub = 'good'
A=RemoveInList(sub,A)

Alors A sera

enter image description here

0
rsc05

Lorsque plusieurs sous-chaînes doivent être supprimées, une option simple et efficace consiste à utiliser re.sub avec un motif compilé impliquant la jonction de toutes les sous-chaînes à supprimer à l'aide de l'expression régulière OR (|) pipe.

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']
0
cs95