Gemakkelijkste manier om een ​​string te vervangen met behulp van een woordenboek van vervangingen?

Overweeg..

dict = {
'':'',
'russianA':'englishA'
}
s = ' russianA'

Ik wil graag alle dict-sleutels vervangen door hun respectievelijke dict-waarden in s.


Antwoord 1, autoriteit 100%

Re:

. gebruiken

import re
s = ' not russianA'
d = {
'':'',
'russianA':'englishA'
}
pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b')
result = pattern.sub(lambda x: d[x.group()], s)
# Output: ' not englishA'

Dit komt alleen overeen met hele woorden. Als je dat niet nodig hebt, gebruik dan het patroon:

pattern = re.compile('|'.join(d.keys()))

Houd er rekening mee dat u in dit geval de woorden aflopend op lengte moet sorteren als sommige van uw woordenboekitems subtekenreeksen van andere zijn.


Antwoord 2, autoriteit 25%

Je zou de functie verminderenkunnen gebruiken:

reduce(lambda x, y: x.replace(y, dict[y]), dict, s)

Antwoord 3, autoriteit 19%

Oplossing hier gevonden(ik hou van de eenvoud):

def multipleReplace(text, wordDict):
    for key in wordDict:
        text = text.replace(key, wordDict[key])
    return text

Antwoord 4, autoriteit 5%

enkele reis, zonder re

d = {
'':'',
'russianA':'englishA'
}
s = ' russianA'.split()
for n,i in enumerate(s):
    if i in d:
        s[n]=d[i]
print ' '.join(s)

Antwoord 5, autoriteit 3%

Bijna hetzelfde als ghostdog74, maar onafhankelijk gemaakt. een verschil,
het gebruik van d.get() in plaats van d[] kan items aan die niet in het dictaat staan.

>>> d = {'a':'b', 'c':'d'}
>>> s = "a c x"
>>> foo = s.split()
>>> ret = []
>>> for item in foo:
...   ret.append(d.get(item,item)) # Try to get from dict, otherwise keep value
... 
>>> " ".join(ret)
'b d x'

Antwoord 6

Ik gebruikte dit in een vergelijkbare situatie (mijn string was helemaal in hoofdletters):

def translate(string, wdict):
    for key in wdict:
        string = string.replace(key, wdict[key].lower())
    return string.upper()

hoop dat dat op de een of andere manier helpt… 🙂


Antwoord 7

Met de waarschuwing dat het mislukt als de sleutel ruimte heeft, is dit een gecomprimeerde oplossing vergelijkbaar met ghostdog74 en extaneons antwoorden:

d = {
'':'',
'russianA':'englishA'
}
s = ' russianA'
' '.join(d.get(i,i) for i in s.split())

Other episodes