2016-05-22 18 views
21

私は文字列のセットset1を持っていて、set1のすべての文字列は、私が必要としない2つの部分文字列を持っています。
サンプル入力: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
だから、基本的に私はすべての文字列から削除.good.badストリングをしたいです。Pythonで一連の文字列から特定の部分文字列を削除するにはどうすればよいですか?

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

しかし、これはまったく機能していないようです。私が試した何
。出力にはまったく変化はなく、入力と同じです。私は元のものの代わりにfor x in list(set1)を使ってみましたが、何も変わりません。

答えて

24

文字列は不変です。 string.replace新しい文字列を作成します。これは、マニュアルに記載されている:

戻る古い部分全てをnewに置換出現と、文字列sのコピー。 ...

これは、あなたが(再割り当て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ない変更文字列を行い、それが交換に文字列のコピーを返します。文字列は不変なので、文字列を直接変更することはできません。

x.replaceからの戻り値を新しいセットに入れる必要があります。

+0

しかし、私は文字列のセットをループ、どのように私は新しいセットを更新することができたときに? set_name.updateを使用していますか?それを表示できますか? – controlfreak

5

あなたがこれを行うことができます:

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

行 'x.replace( '。good'、 '')'と 'x.replace( 'bad'、 '')'は最終結果に何もしません。プリントアウトはそれらなしで同じになります。 –

+0

また、次のように 're.sub'という行を1つだけ使用したいと思います。' x = re.sub '((\。good $)|(\。bad $))'、 ''、x) ' –

1

私はテストを行いましたが(あなたの例ではありません)、データは規則正しくまたは完全に返されません。

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

が、私はこれが機能することを証明した:

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

または

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