我正在从一种源语言(输入文件)音译到目标语言(目标文件),所以我在源代码的字典中检查等效映射,源代码中的某些字符没有等效映射,例如comma(,) 和所有其他此类特殊符号。如何检查字符是否属于我具有等效映射的字典,甚至处理要在目标文件中打印的在字典中没有等效映射的特殊符号。谢谢:)。
5 回答
我的建议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))
如果您使用translate
Unicode 对象的方法,正如我在回答您的另一个问题时所建议的那样,一切都会按照您的意愿自动为您完成:c
代码点 ( ord(c)
) 不在音译字典中的每个 Unicode 字符都简单地从输入传递到输出,如你所愿。为什么要重新发明轮子?
我想你想要这样的东西:
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")
dictx = {}
for itm in my_source :
dictx[itm] = dictx.get(itm, 0) + 1
我没有完全理解你的问题的细节,但这是我能想到的最简单的例子,它说明了我认为你所追求的模式。
我相信'get'方法就是你想要的。它允许您从字典中检索一个键,但如果该键不存在,您可以设置一个默认值 - 即“我想要 dictx[itm](分配给键 'itm' 的值)但如果' itm' 不在字典中,然后创建它并为 .'
此片段将遍历您的源文档('my_source')并计算其中各种项目的频率,将这些计数作为值添加到字典中已有的键中,但是当它到达不存在键的项目时,不抛出异常,添加一个键并分配一个值“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 是否被认为是一个有效单词的一部分——也许是二进制搜索的东西),但希望你明白这个想法.