Python - 检查char是否在字典中,如果不处理它

时间:2010-02-13 14:09:12

标签: python transliteration

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

5 个答案:

答案 0 :(得分:3)

我的建议,因为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 :(得分:3)

如果您使用Unicode对象的translate方法,正如我在回答您的另一个问题时所建议的那样,所有内容都会根据您的需要自动完成:每个Unicode字符c的代码点({ {1}})不在音译词典中,只是根据需要简单地从输入传递到输出。为什么重新发明轮子?

答案 2 :(得分:1)

我想你想要这样的东西:

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

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

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

希望有所帮助。

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

    translatedToken = tokenMapping.get(token, "transliteration unknown")

答案 3 :(得分:0)

dictx = {}
for itm in my_source :
    dictx[itm] = dictx.get(itm, 0) + 1

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

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

的值

此代码段将遍历源文档('my_source')并计算其中各项的频率,将这些计数值作为值添加到字典中已有的键中,但是当它到达没有键的项时存在,不抛出任何异常,添加密钥并赋值为“0”。

答案 4 :(得分:0)

这看起来非常简单。如果你的字典是字符char,那么你会做类似的事情

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

这里,instr是你的输入字符串,mydict包含你的chars到chars的映射。

如果你想检查部分单词,我建议使用两个词典:一个包含任何单词中包含的字符,一个包含单词。您可以像这样使用它:

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是否被认为是有效单词的一部分 - 也许是二进制搜索的东西),但希望你能得到这个想法。