我正在从一种源语言(输入文件)到目标语言(目标文件)的音译,所以我在源代码中检查字典中的等效映射,源代码中的某些字符没有等效映射,如逗号(,)和所有其他此类特殊符号。如何检查字符是否属于我具有等效映射的字典,甚至还要处理要在目标文件中打印的特殊符号,这些特殊符号在字典中没有等效映射。谢谢你:)。
答案 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是否被认为是有效单词的一部分 - 也许是二进制搜索的东西),但希望你能得到这个想法。