使用字典进行翻译(Python)

3

好的,我的老师给了我以下的任务,我们只学了一天的字典:

1) 创建一个字典,将一种语言的句子翻译成另一种语言(例如从西班牙语到英语)。 2) 程序应该先用第一种语言写出一个句子,然后再用第二种语言。

到目前为止,我的代码是这样的:

def userinput():
    inputsentence = input("What sentence would you like to translate?(Hint! Make the sentence I speak _ more than my friends")
    spanoreng = input("Is this sentence Spanish or English?(Please enter span or eng")
    return(inputsentence,spanoreng)

def spantoeng(spantoengtras,inputsentence):
    inputsentence.lower()
    inputsentence.split()
    print(inputsentence)
def engtospan(engtospantrans,inputsentence):
    inputsentence.lower()
    inputsentence.split()
    print(inputsentence)
def main():
    spantoengtrans = {'yo' : 'I', 'hablo' : 'speak', 'espanol' : 'spanish', 'ingles' : 'english', 'mas' : 'more', 'de' : 'than','mis' : 'my', 'amigos' : 'friends'}
    engtospantrans = {'I' : 'yo', 'speak' : 'hablo', 'spanish' : 'espanol', 'english' : 'ingles', 'more' : 'mas', 'than' : 'de','my' : 'mis', 'friends' : 'amigos'}
    (inputsentence,spanoreng) = userinput()
    if spanoreng == 'span':
        spantoeng(spantoengtrans,inputsentence)
    elif spanoreng == 'eng':
        engtospan(engtospantrans,inputsentence)
    else:
        print("please type span or eng")
        (inputsentence,spanoreng) = userinput()


main()

我遇到的问题是使用字典来改变列表。此外,我的 .lower() 似乎没有起到作用。能帮忙吗?

编辑:我意识到了我的错误。谢谢。


Python中的字符串是不可变的。lower()方法返回一个新的字符串,你必须将其分配给另一个变量或重新分配回inputsentence。对于split()也是同样适用。 - Kevin Thibedeau
你应该使用raw_input而不是input - Jeremy Blalock
4个回答

4

我没有看到任何列表 - 我只看到不可变的字符串,并且没有使用字典。

因此,核心函数可能是:

def translate(sentence, transdict):
    words = sentence.split()
    trans = [transdict.get(w.lower(),w) for w in words]
    print(' '.join(trans))

split将句子分割成由空格分隔的单词列表;然后列表推导式将其转换为翻译后的单词列表(如果单词不在字典中,则保持原样);最后,我们将后者列表连接回一个以空格分隔的句子。

当然,这还远远不够好,但是如果没有正则表达式,很难做得更好 - 如果你只使用字典学了一天的话,那么正则表达式可能已经超出了你的学习范围。但如果已经掌握,可以考虑使用它。

import re

def maketrans(somedict):
    def trans(mo):
        word = mo.group()
        return somedict.get(word.lower(), word)
    return trans

然后

translated = re.sub(r'\w+', maketrans(right_dict), sentence)
print (translated)

保留标点和空格。但是在正则表达式和高阶函数之间的内容,我怀疑你最好先忽略这个,直到你在Python学习中更深入了解它们:-)。


0

首先,你只需要一个translate函数。这个函数的目标是接收一个句子和一个字典,并输出另一种语言的句子。为了实现这个目标,我会这样做:

def translate(trans,inputsentence):
    inputsentence.lower()
    words = inputsentence.split(' ')
    new_sentence = [trans[w] for w in words]
    print(' '.join(new_sentence))

接下来,对于您的输入函数,您需要调用raw_input()而不是input()。这将清除语法错误。
def userinput():
    inputsentence = raw_input("What sentence would you like to translate?(Hint! ... > ")
    spanoreng = raw_input("Is this sentence Spanish or English? > ")
    return(inputsentence,spanoreng)

如果你适当地重命名main()内的函数调用,那就差不多了。


0

这并不回答你的主要问题,但是你的lower()调用无法正常工作的原因是因为你在调用inputsentence.lower()时没有将返回值赋给一个变量,所以它只是返回小写字符串,但没有任何指向它的东西。原始字符串保持不变。当你执行inputsentence.split()时也会发生同样的事情,列表被创建并返回,但它没有去任何地方。最终,当你return inputsentence时,你返回的是你给它的完全相同的值,使得lower()和split()什么都没做。

如果你想每次使用字符串方法替换变量inputsentence的值,你应该这样做:

inputsentence = inputsentence.lower().split()

0
你应该将变量赋值给.lower()的输出,并将.split()应用于该变量。你想要返回(或在当前代码中打印)的是那个输出(保存为一个变量)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接