Python - чтобы проверить, есть ли символ в словаре, и если не иметь дело с ним - PullRequest
2 голосов
/ 13 февраля 2010

Я собираюсь транслитерировать с одного исходного языка (входного файла) на целевой язык (целевой файл), поэтому я проверяю эквивалентные отображения в словаре в моем исходном коде, некоторые символы в исходном коде не имеют эквивалентное отображение, как запятая (,) и все другие такие специальные символы. Как проверить, принадлежит ли символ словарю, для которого у меня есть эквивалентное отображение, и даже позаботиться о тех специальных символах, которые будут напечатаны в целевом файле, которые не имеют эквивалентного отображения в словаре. Спасибо:).

Ответы [ 5 ]

3 голосов
/ 13 февраля 2010

Если вы используете метод translate объектов Unicode, как я рекомендовал в ответе на другой ваш вопрос, все будет сделано автоматически для вас именно так, как вы хотите: каждый символ Unicode c, чьи кодовые точки (ord(c)) не в словаре транслитерации просто передается без изменений от ввода к выводу, как вы хотите. Зачем изобретать велосипед?

3 голосов
/ 13 февраля 2010

Моя рекомендация, учитывая, что rules - это отображение символов в их транслитерированных эквивалентах:

results = []
for char in source_text:
    results.append(rules.get(char, char))
return ''.join(results)    # turns the list back into a string

Метод dict get вернет либо значение ключа, либо значение по умолчанию, если ключ не существует - обычно значением по умолчанию является None, но в этом случае мы дали тот же символ, что и по умолчанию значение (второй аргумент), так что если ключ не найден, он просто вернется сам.

Более компактный способ написать это с помощью выражений генератора:

''.join((rules.get(char, char) for char in source_text))
1 голос
/ 13 февраля 2010

Я думаю, вы хотите что-то вроде этого:

tokenMapping = {"&&" : "and"}

for token in source file: # <-- pseudocode
    translatedToken = tokenMapping[token] if token in tokenMapping else "transliteration unknown"

Если в словаре есть перевод (например, "&&" -> "и"), он будет использовать его. Иначе это будет переводиться как «неизвестная транслитерация».

Надеюсь, это помогло.

РЕДАКТИРОВАТЬ: Как предложил LeafStorm, функция get словаря может быть использована для упрощения приведенного выше кода. Строка кода в цикле станет

    translatedToken = tokenMapping.get(token, "transliteration unknown")
0 голосов
/ 13 февраля 2010

Это кажется довольно простым. Если ваш словарь - char to char, то вы бы сделали что-то вроде

outstr = ''
for ch in instr:
    if ch in mydict:
        outstr += mydict[ch]
    else:
        outstr += ch

Здесь instr - ваша входная строка, а mydict содержит отображение символов в символы.

Если вы хотите проверить части слов, я бы рекомендовал использовать два словаря: один, содержащий символы, содержащиеся в любом слове, и другой, содержащий слова. Вы можете использовать это так:

outstr = ''
word = ''
for ch in instr:
    if ch in chardict:
        word += ch
    else:
        if len(word):
            if word in worddict:
                outstr += worddict[word]
            else:
                outstr += word
            word = ''
        outstr += ch
if len(word):
    outstr += worddict[word]
else:
    outstr += word
Например,

chardict может содержать весь алфавит. Конечно, вы можете захотеть сделать некоторые части немного по-другому (например, использовать что-то отличное от chardict, чтобы проверить, следует ли считать символ частью правильного слова - возможно, что-то с помощью двоичного поиска), но, надеюсь, вы поняли ,

0 голосов
/ 13 февраля 2010
dictx = {}
for itm in my_source :
    dictx[itm] = dictx.get(itm, 0) + 1

Я не совсем понял детали вашего вопроса, но вот самый простой пример, который я мог бы себе представить, который иллюстрирует шаблон, который, я думаю, вам нужен.

Метод 'get', который я считаю, - это то, что вы хотите. Он позволяет вам извлечь ключ из словаря, но если ключа там нет, вы можете установить значение по умолчанию - то есть, «я хочу dictx [itm] (значение, назначенное ключу« itm »), но если» itm 'нет в словаре, затем создайте его и значение.'

Этот фрагмент будет перебирать ваш исходный документ ('my_source') и подсчитывать частоту различных элементов в нем, добавляя эти значения в качестве значений к ключам, уже находящимся в вашем словаре, но когда он достигает элемента, для которого нет ключа существует, исключение не выдается, добавляется ключ и присваивается значение «0».

...