2010-12-07 34 views
4

基本的には、文字列内の文字が複数回出現する場合には、一度に1つずつ削除したいと考えています。文字列内の文字を一度に1つずつ削除する

たとえば: - 単語abacceaと文字 'a'がある場合、関数の出力はbaccea、abacce、abcceaでなければなりません。

私はmaketransを空文字列にすることができますが、文字列中のすべてのaを置き換えることを読んでいます。

これを行うには効率的な方法はありますか?リスト内のすべての位置に注目してから、単語を置き換えて生成します。

答えて

5

はそれを行うための簡単な方法です:

In [6]: s = "abaccea" 
In [9]: [s[:key] + s[key+1:] for key,val in enumerate(s) if val == "a"] 
Out[10]: ['baccea', 'abccea', 'abacce'] 

にできるという利点があります大括弧を丸いものに置き換えることによって、これをジェネレータに変換することができます。

+0

私はあなたが書いたものであると思っています。[キー+ 1:] ' – Triptych

+0

@Triptynch。 –

1

私はあなたのアプローチがうまくいくと思います。それはそれを実行するのに合理的に効率的な方法であり、あなたがしていることを読者に明白にします。

ただし、少し優雅ではあるが、おそらく速い代替方法は、find機能のstartパラメータを使用することです。

i = 0 
while True: 
    j = word.find('a', i) 
    if j == -1: 
     break 
    print word[:j] + word[j+1:] 
    i = j + 1 

検索機能は非常にCで最適化される可能性があるので、これはあなたにPythonで文字列を自分で文字を反復処理と比較して、パフォーマンスの向上を与えることができます。あなたがこれをやりたいかどうかは、あなたが効率性や優雅さを求めているかどうかによって決まります。私はまず、シンプルで明確なアプローチに進み、性能プロファイリングが効率が重要な問題であることを示す場合にのみ最適化することをお勧めします。ここで

findを使用してコードを高速に実行できることを示すいくつかのパフォーマンスの測定値である:ここで

 
>>> method1='[s[:key] + s[key+1:] for key,val in enumerate(s) if val == "a"]' 
>>> method2=''' 
result=[] 
i = 0 
while True: 
    j = s.find('a', i) 
    if j == -1: 
     break 
    result.append(s[:j] + s[j+1:]) 
    i = j + 1 
''' 

>>> timeit.timeit(method1, init, number=100000) 
2.5391986271997666 
>>> timeit.timeit(method2, init, number=100000) 
1.1471052885212885 
+0

そして、なぜ理解を最適化することではないでしょうか? (私は知らないので尋ねているだけです**泣き言ではありません) –

+0

@Gabi Purcaru:理想的には理想的な世界では、ジェネレータの表現がより速くなるはずです。しかし、Pythonの標準ディストリビューションにはJITコンパイラが含まれていません。つまり、Pythonで書くコードは、Cコードの呼び出しよりも遅く実行されます。すべての文字比較はPython呼び出しで行われるので、 'str.find'のコードはC言語で書かれていますが、同じ問題がありません。 JITコンパイラを含むPython実装を使用している場合は、パフォーマンスの差が小さくなると思います。 –

+0

@Gabi Purcaru:答えにいくつかのパフォーマンス測定値を追加しました。 –

-2

これはどうですか?

>>> def replace_a(word): 
...  word = word[1:8] 
...  return word 
... 
>>> replace_a("abaccea") 
'baccea' 
>>> 
+0

これは全く質問に答えるものではなく、「abaccea」の最初の「a」を置き換えるという非常に具体的な例でのみ機能します。 – eldarerathis

+0

ああ申し訳ありません....... –

3

次のスクリプトを試すことができます。それはあなたが求めるものを行うためのシンプルな機能を提供します。リストの理解[x for x in y if something(x)]の使用は十分学習価値があります。

#!/usr/bin/python 

word = "abaccea" 
letter = "a" 

def single_remove(word, letter): 
    """Remove character c from text t one at a time 
    """ 
    indexes = [c for c in xrange(len(word)) if word[c] == letter] 
    return [word[:i] + word[i + 1:] for i in indexes] 

print single_remove(word, letter) 

戻り['baccea', 'abccea', 'abacce']

乾杯

関連する問題