Erwägen..
dict = {
'Спорт':'Досуг',
'russianA':'englishA'
}
s = 'Спорт russianA'
Ich möchte alle Diktatschlüssel durch ihre jeweiligen Diktatwerte in ersetzen s
.
Erwägen..
dict = {
'Спорт':'Досуг',
'russianA':'englishA'
}
s = 'Спорт russianA'
Ich möchte alle Diktatschlüssel durch ihre jeweiligen Diktatwerte in ersetzen s
.
dict
wird am besten als Variablenname vermieden, da eine Variable dieses Namens die integrierte Funktion mit demselben Namen beschatten würde.
Antworten:
Verwenden von re:
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'
Dies entspricht nur ganzen Wörtern. Wenn Sie das nicht brauchen, verwenden Sie das Muster:
pattern = re.compile('|'.join(d.keys()))
Beachten Sie, dass Sie in diesem Fall die absteigenden Wörter nach Länge sortieren sollten, wenn einige Ihrer Wörterbucheinträge Teilzeichenfolgen anderer sind.
.join(d.keys())
könnte durch ersetzt werden .join(re.escape(key) for key in d.keys())
.
https://regex101.com/r/bliVUS/1
- Ich muss es \b
am Ende entfernen, bin mir aber nicht sicher, ob es korrekt ist.
Sie können die Reduktionsfunktion verwenden:
reduce(lambda x, y: x.replace(y, dict[y]), dict, s)
reduce
bei der Verwendung die Substitutionen nacheinander angewendet . Infolgedessen { 'red': 'green', 'green': 'red'}
funktioniert das Austauschen von Wörtern mithilfe von Wörterbüchern nicht mit dem reduce
basierenden Ansatz, und überlappende Übereinstimmungen werden auf unvorhersehbare Weise transformiert.
.replace()
Anrufe unbeabsichtigte Folgen haben können: - html.replace('"', '"').replace('&', '&')
Versuchen Sie es weiter html = '"foo"'
.
Hier gefundene Lösung (ich mag die Einfachheit):
def multipleReplace(text, wordDict):
for key in wordDict:
text = text.replace(key, wordDict[key])
return text
ein Weg, ohne re
d = {
'Спорт':'Досуг',
'russianA':'englishA'
}
s = 'Спорт russianA'.split()
for n,i in enumerate(s):
if i in d:
s[n]=d[i]
print ' '.join(s)
Fast das gleiche wie Ghostdog74, obwohl unabhängig erstellt. Ein Unterschied besteht darin, dass die Verwendung von d.get () anstelle von d [] Elemente verarbeiten kann, die nicht im Diktat enthalten sind.
>>> 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'
Ich habe dies in einer ähnlichen Situation verwendet (meine Zeichenfolge war alle in Großbuchstaben):
def translate(string, wdict):
for key in wdict:
string = string.replace(key, wdict[key].lower())
return string.upper()
hoffe das hilft irgendwie ... :)
Mit der Warnung, dass es fehlschlägt, wenn der Schlüssel über Speicherplatz verfügt, handelt es sich um eine komprimierte Lösung, die der Antwort von ghostdog74 und extaneons ähnelt:
d = {
'Спорт':'Досуг',
'russianA':'englishA'
}
s = 'Спорт russianA'
' '.join(d.get(i,i) for i in s.split())
{'cat': 'russiancat'}
und "Raupe"). Auch überlappende Wörter ({'car':'russiancar', 'pet' : 'russianpet'}
und "Teppich").