3

タプルのリストがあり、それぞれに文字列に適用したい検索/置換値が含まれています。そうするための最も効率的な方法は何ですか?これを繰り返し適用するので、パフォーマンスが最大の関心事です。

より具体的には、processThis() の内部はどのようになりますか?

x = 'find1, find2, find3'
y = [('find1', 'replace1'), ('find2', 'replace2'), ('find3', 'replace3')]

def processThis(str,lst):
     # Do something here
     return something

>>> processThis(x,y)
'replace1, replace2, replace3'

皆さんありがとう!

4

5 に答える 5

6

次の使用を検討できますre.sub

import re
REPLACEMENTS = dict([('find1', 'replace1'),
                     ('find2', 'replace2'),
                     ('find3', 'replace3')])

def replacer(m):
    return REPLACEMENTS[m.group(0)]

x = 'find1, find2, find3'
r = re.compile('|'.join(REPLACEMENTS.keys()))
print r.sub(replacer, x)
于 2009-07-24T02:55:05.307 に答える
1

いくつかのメモ:

  1. 時期尚早の最適化、ベンチマーク、ボトルネック、100が小さいなどに関する定型的な議論。
  2. 異なるソリューションが異なる結果を返す場合があります。もしそうならy = [('one', 'two'), ('two', 'three')]x = 'one'mhawkeの解はあなたに与え'two'、Unknownの解はあなたに与えます'three'
  3. ばかげた工夫の例でこれをテストすると、mhawkeのソリューションは少し速くなりました。ただし、データで簡単に試すことができます。
于 2009-07-24T03:40:13.850 に答える
0
x = 'find1, find2, find3'
y = [('find1', 'replace1'), ('find2', 'replace2'), ('find3', 'replace3')]

def processThis(str,lst):
    for find, replace in lst:
        str = str.replace(find, replace)

    return str

>>> processThis(x,y)
'replace1, replace2, replace3'
于 2009-07-24T02:53:08.990 に答える
0
s = reduce(lambda x, repl: str.replace(x, *repl), lst, s)
于 2009-07-24T03:05:45.990 に答える