Запрещение ключей длиной больше 1 имеет свои намерения. Например, если у вас есть два ключа перевода - «ca» и «c», какой из них является приоритетным?
Я не знаю вашего конкретного варианта использования c, но предположим, что вы заказали карту перевода в ваш интересующий порядок (чаще всего я думаю, вы захотите отсортировать его по длине, от наименьшего к наибольшему).
Затем вы можете реализовать следующее:
import re
def custom_make_translation(text, translation):
regex = re.compile('|'.join(map(re.escape, translation)))
return regex.sub(lambda match: translation[match.group(0)], text)
Обратите внимание, что с данной реализацией это
translation = {
"hi":"jk",
"as":"bc",
"ca":"sa",
"c": "oh no, this is not prioritized"
}
text = "hi this is as test ca"
translated = custom_make_translation(text, translation)
даст значение переведенного "jk tjks is bc test sa"
Но это будет иметь приоритет «c» над «ca», как это было раньше. в dict
translation = {
"hi":"jk",
"as":"bc",
"c": "i have priority",
"ca":"sa"
}
text = "hi this is as test ca"
translated = custom_make_translation(text, translation)
даст значение переведенного "jk tjks is bc test i have prioritya"
, поэтому убедитесь, что вы используете его с осторожностью.
Кроме того, используя регулярное выражение, а не .replace in a for l oop гарантирует, что вы произведете все замены сразу. В противном случае, если у вас есть текст "a"
и карта перевода: {"a": "ab", "ab": "abc"}
, перевод будет "abc"
, а не "ab"