迭代查找/替换Python中的元组列表

时间:2009-07-24 02:48:28

标签: python django list iteration tuples

我有一个元组列表,每个元组都包含一个我想要应用于字符串的查找/替换值。最有效的方法是什么?我会迭代地应用它,因此性能是我最关心的问题。

更具体地说,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'

谢谢,全部!

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

一对夫妇注意到:

  1. 关于过早优化,基准测试,瓶颈,100的样板论证很小等等。
  2. 有些情况下,不同的解决方案会返回不同的结果。如果y = [('one', 'two'), ('two', 'three')]x = 'one',则mhawke的解决方案会为您提供'two',而未知的解决方案会提供'three'
  3. 在一个愚蠢的人为设计的例子中进行测试mhawke的解决方案是 tiny 位更快。尽管如此,您可以轻松地尝试使用您的数据。

答案 2 :(得分: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'

答案 3 :(得分:0)

s = reduce(lambda x, repl: str.replace(x, *repl), lst, s)

答案 4 :(得分:0)

与mhawke相同的答案,附带方法str_replace

def str_replace(data, search_n_replace_dict):
    import re
    REPLACEMENTS = search_n_replace_dict

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

    r = re.compile('|'.join(REPLACEMENTS.keys()))
    return r.sub(replacer, data)

然后我们可以用下面的例子来调用这个方法

s = "abcd abcd efgh efgh;;;;;; lkmnkd kkkkk"
d = dict({ 'abcd' : 'aaaa', 'efgh' : 'eeee', 'mnkd' : 'mmmm' })


print (s)
print ("\n")
print(str_replace(s, d))

输出:

abcd abcd efgh efgh;;;;;; lkmnkd kkkkk


aaaa aaaa eeee eeee;;;;;; lkmmmm kkkkk