2012-03-23 51 views
23

Pythonを使用して文字列から重複する文字を削除するにはどうすればよいですか?文字列から重複する文字を削除する

foo = 'mpt' 

注:順序は重要ではありません場合は順序は重要ではありません

+2

エヘン... http://stackoverflow.com/questions/636977/best-way-to-remove-duplicate-characters-words-in-a-string – nullpotent

+1

@ AljoshaBre - '閉じる'ボタンを使用して、 'dupeとしてクローズ 'を選択し、そのリンクを提供してください。ありがとうございます –

+2

@AljoshaBreこれらの回答はどれも注文を維持するために保証されていません。 – Marcin

答えて

49

、あなたが使用することができ、私は文字列を作ることができますどのように

foo = 'mppmt' 

:たとえば、のは、私は、文字列を持っているとしましょう

"".join(set(foo)) 

set()文字列で一意の文字のセットを作成し、"".join()は文字を任意の順序で文字列に戻します。オーダー問題を行う場合

、あなたは、Python 2.7でcollections.OrderedDictを使用することができます。

from collections import OrderedDict 
foo = "mppmt" 
print "".join(OrderedDict.fromkeys(foo)) 

印刷

mpt 
+2

+1: 'fromkeys()'はあまり頻繁には使われませんが、ここではそれを優れた使い方にしています。 – EOL

+0

+1 'fromkeys()の優れた使い方 –

1

を順序は問題ではない場合:

>>> foo='mppmt' 
>>> ''.join(set(foo)) 
'pmt' 

は維持するために注文:

>>> foo='mppmt' 
>>> ''.join([j for i,j in enumerate(foo) if j not in foo[:i]]) 
'mpt' 
0

順序が重要な場合は、

seen = set() 
result = [] 
for c in foo: 
    if c not in seen: 
     result.append(c) 
     seen.add(c) 
result = ''.join(result) 

または設定せずにそれを行うには:

result = [] 
for c in foo: 
    if c not in result: 
     result.append(c) 
result = ''.join(result) 
+1

@Marcin:私はそれを全く理解していません。常にセットに入っていませんか? – DSM

+0

@Marcinそれは常に空文字列を返します。 fooの全てのcはset(foo) –

+1

@ DSM/Kevinに入っています。私は答えとして投稿していない良いこと。 'seen = set(); '' '.join(見えていない場合はfooのcのために(c)またはcを見た) '。これは明示的な金曜日より明白です。 – Marcin

26

ため問題を行う場合、どの程度:

>>> foo = 'mppmt' 
>>> ''.join(sorted(set(foo), key=foo.index)) 
'mpt' 
+6

簡潔で読みやすい。残念ながら、それはO(n^2)です。 –

+2

十分です。しかし、5文字の文字列のOrderedDict.fromkeysよりも8倍も高速です。 ;-) DSM

+0

あなたはこの1を獲得。 – Marcin

0

として、 ".join(set(foo))とcollections.OrderedDicしません。 文字列に大文字と小文字があり、すべての重複を削除する必要がある場合は、foo = foo.lower()が追加されました。

from collections import OrderedDict 
foo = "EugeneEhGhsnaWW" 
foo = foo.lower() 
print "".join(OrderedDict.fromkeys(foo)) 

プリントeugnhsaw

関連する問題