2016-05-22 3 views
21

Ho un set di stringhe set1 e tutte le stringhe in set1 hanno due sottostringhe specifiche che non ho bisogno e voglio rimuovere.
ingresso Esempio: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Quindi, fondamentalmente voglio le .good e .bad sottostringhe rimossi da tutte le corde.
Quello che ho cercato:Come rimuovere sottostringhe specifiche da un set di stringhe in Python?

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

Ma questo non sembra funzionare affatto. Non c'è assolutamente alcun cambiamento nell'output ed è lo stesso dell'input. Ho provato a usare for x in list(set1) invece di quello originale ma questo non cambia nulla.

risposta

24

Le stringhe sono immutabili. string.replace crea una stringa nuova. Questo è indicato nella documentazione:

Return un copia della stringa s con tutte le occorrenze della stringa old sostituite dalle nuove. ...

Questo significa che è necessario riassegnare il set o ripopolare esso (riassegnare gli è più facile con set comprehension):

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

.replace non cambiamento la stringa, restituisce una copia della stringa con la sostituzione. Non è possibile modificare direttamente la stringa perché le stringhe sono immutabili.

È necessario prendere i valori di ritorno da x.replace e inserirli in un nuovo set.

+0

Ma quando ho loop all'interno di una serie di stringhe, come posso aggiornare un nuovo insieme? usando set_name.update? Potresti mostrarlo? – controlfreak

5

Si potrebbe fare questo:

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) 
+0

riga 'x.replace ('. Good', '')' e 'x.replace ('. Bad', '')' non fa nulla al risultato finale. La stampa sarà la stessa senza di loro. –

+0

Inoltre preferirei avere una sola riga con 're.sub', come segue:' x = re.sub ('((\. Good $) | (\. Bad $))', '', x) ' –

1

Ho eseguito il test (ma non è il tuo esempio) e i dati non li restituiscono ordinati o completi

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

ho dimostrato che questo funziona:

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