2

我正在从一种源语言(输入文件)音译到目标语言(目标文件),所以我在源代码的字典中检查等效映射,源代码中的某些字符没有等效映射,例如comma(,) 和所有其他此类特殊符号。如何检查字符是否属于我具有等效映射的字典,甚至处理要在目标文件中打印的在字典中没有等效映射的特殊符号。谢谢:)。

4

5 回答 5

3

我的建议rules是,将字符映射到其音译等价物:

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

get如果键不存在,dict 的方法将返回键的值或默认值——通常默认值为None,但在这种情况下,我们给出了与默认值(第二个参数)相同的字符,这样如果找不到密钥,它只会返回自己。

使用生成器表达式编写此代码的更紧凑的方法是:

''.join((rules.get(char, char) for char in source_text))
于 2010-02-13T14:49:36.923 回答
3

如果您使用translateUnicode 对象的方法,正如我在回答您的另一个问题时所建议的那样,一切都会按照您的意愿自动为您完成:c代码点 ( ord(c)) 不在音译字典中的每个 Unicode 字符都简单地从输入传递到输出,如你所愿。为什么要重新发明轮子?

于 2010-02-13T16:58:40.830 回答
1

我想你想要这样的东西:

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

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

如果字典中有翻译(例如“&&” -> “and”),它将使用它。否则它将翻译为“音译未知”。

希望有帮助。

编辑:正如 LeafStorm 所建议的,字典的get功能可用于简化上述代码。循环中的代码行将变为

    translatedToken = tokenMapping.get(token, "transliteration unknown")
于 2010-02-13T14:15:07.787 回答
0
dictx = {}
for itm in my_source :
    dictx[itm] = dictx.get(itm, 0) + 1

我没有完全理解你的问题的细节,但这是我能想到的最简单的例子,它说明了我认为你所追求的模式。

我相信'get'方法就是你想要的。它允许您从字典中检索一个键,但如果该键不存在,您可以设置一个默认值 - 即“我想要 dictx[itm](分配给键 'itm' 的值)但如果' itm' 不在字典中,然后创建它并为 .'

此片段将遍历您的源文档('my_source')并计算其中各种项目的频率,将这些计数作为值添加到字典中已有的键中,但是当它到达不存在键的项目时,不抛出异常,添加一个键并分配一个值“0”。

于 2010-02-13T14:37:29.043 回答
0

这似乎很简单。如果你的字典是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 以外的东西来检查一个 char 是否被认为是一个有效单词的一部分——也许是二进制搜索的东西),但希望你明白这个想法.

于 2010-02-13T15:56:50.217 回答