根据dict

时间:2016-01-30 09:19:13

标签: python string performance replace

我想根据字典替换一个很长的字符串。我的代码是这样的:

def rep(self, mystr, dict):
    new_pstr = ''
    for char in mystr:
        try:
            new_pstr += dict[char]
        except:
            continue
    return new_pstr

此代码没有我预期的那么快。也许没有循环,它会更快。但我不知道该怎么做。最后但并非最不重要的是,我不能一起替换所有相同的角色,每次我只能替换一个角色。因此,替换功能可能不是我的选择。为了更清楚,我举一个例子:

如果d = {'A':'C', 'C':'B'}mystr = 'AC',则new_pstr = 'CB'

(如果你的方式归还我'BB',这不是我的预期)

在实际情况中,我的字典看起来像这样:

d = {u'q': [u'k'], u'v': [u'v'], u'e': [u'e'], u'\xe7': [u'\xe7'], u'\xe9': [u'e'], u'h': [u'y'], u'j': [u'z'], u'o': [u'u'], u'\xf1': [u'g'], u'i': [u'i'], u'\u015f': [u's'], u'\xf6': [u'u'], u'x': [u'x'], u'\xfc': [u'v'], u'\u011f': [u'g']}

和我的字符串一样:

str = "tériniñ yiriklişip kétişi havadiki nemlikniñ tövenlep ketkenlikidin bolup ، bu vaqitta tére téximu qurğaqlişip kétidu ، tériniñ ilastikiliqi acizlap ، xünük bolup qalidu. şuña xanim – qizlar bundaq vaqitta tére qurğaqlişişniñ aldini alidiğan çare– tedbirlerni qolliniş kérek. nemlikni saqlaşta yuquri dericilik su toluqlaş yüzlüki، hesel ve örük méğizi méyiğa muvapiq miqdarda un arilaşturup melhem qilip yüzge çaplap bers e، yaki nemxuşluqi yuquri bolğan tére nemleştürüş vazilin méyi sürüp berse، qurğaq térige su toluqlaşqa paydiliq."

我使用 的原因尝试..除了... ,因为我的代码有时会返回错误UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 2: ordinal not in range(128)

3 个答案:

答案 0 :(得分:1)

查阅此Tutorial。它可能对你有帮助。

  

方法 translate()返回字符串的副本,其中所有字符都已使用表格翻译(使用字符串模块中的 maketrans()函数构建) ,可选择删除字符串deletechars中的所有字符。

示例代码:

以下是从字符串中删除'x'和'm'字符的示例:

#!/usr/bin/python

from string import maketrans   # Required to call maketrans function.

intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)

str = "this is string example....wow!!!";
print str.translate(trantab, 'xm')

这将产生以下结果 -

th3s 3s str3ng 21pl2....w4w!!!

此代码的source

答案 1 :(得分:1)

您似乎想要做的是将字符更改为等同于ascii,Unidecode lib将为您执行此操作,您需要对字符串进行解码并将其传递给{{1} }:

unidecode.unidecode

或者,如果您有多个字符作为值,这是您自己的逻辑的更快工作版本:

In [8]: s = "tériniñ yiriklişip kétişi havadiki nemlikniñ tövenlep ketkenlikidin bolup ، bu vaqitta tére téximu qurğaqlişip kétidu ، tériniñ ilastikiliqi acizlap ، xünük bolup qalidu. şuña xanim – qizlar bundaq vaqitta tére qurğaqlişişniñ aldini alidiğan çare– tedbirlerni qolliniş kérek. nemlikni saqlaşta yuquri dericilik su toluqlaş yüzlüki، hesel ve örük méğizi méyiğa muvapiq miqdarda un arilaşturup melhem qilip yüzge çaplap bers e، yaki nemxuşluqi yuquri bolğan tére nemleştürüş vazilin méyi sürüp berse، qurğaq térige su toluqlaşqa paydiliq."

In [9]: unidecode.unidecode(s.decode("utf-8"))
Out[9]: 'terinin yiriklisip ketisi havadiki nemliknin tovenlep ketkenlikidin bolup , bu vaqitta tere teximu qurgaqlisip ketidu , terinin ilastikiliqi acizlap , xunuk bolup qalidu. suna xanim - qizlar bundaq vaqitta tere qurgaqlisisnin aldini alidigan care- tedbirlerni qollinis kerek. nemlikni saqlasta yuquri dericilik su toluqlas yuzluki, hesel ve oruk megizi meyiga muvapiq miqdarda un arilasturup melhem qilip yuzge caplap bers e, yaki nemxusluqi yuquri bolgan tere nemlesturus vazilin meyi surup berse, qurgaq terige su toluqlasqa paydiliq.'

In [27]: from itertools import chain In [28]: d = {k:v[0] for k,v in d.items()} In [29]: "".join([d[ch] if ch in d else ch for ch in chain.from_iterable(s)]) Out[29]: 'terinig yiriklisip ketisi yavadiki nemliknig tuvenlep ketkenlikidin bulup ، bu vakitta tere teximu kurgaklisip ketidu ، terinig ilastikiliki acizlap ، xvnvk bulup kalidu. suga xanim – kizlar bundak vakitta tere kurgaklisisnig aldini alidigan çare– tedbirlerni kullinis kerek. nemlikni saklasta yukuri dericilik su tuluklas yvzlvki، yesel ve urvk megizi meyiga muvapik mikdarda un arilasturup melyem kilip yvzge çaplap bers e، yaki nemxusluki yukuri bulgan tere nemlestvrvs vazilin meyi svrvp berse، kurgak terige su tuluklaska paydilik.' 与unicode一起使用的正确方法是使用str.translate个字符

ord

答案 2 :(得分:1)

我通过结合@Padraic Cunningham @PRVS的答案得到最终答案,这个版本比原始代码快100倍。

 new_d = {ord(k): ord(v[0]) for k, v in d.items()} # ord for Unicode characters
 mystr.translate(d)

如果您的代码没有任何Unicode字符,请查看@PRVS答案。