在Python Pig Latin Translator中使用循环

时间:2015-02-28 22:22:24

标签: python

几个小时前我已经开始在Codecademy.com上学习python了,我学会了如何制作一个Piglatin翻译器,将第一个字母贴在最后,然后添加一个。我创建了很多conlangs,我想创建一个词典,我可以点击它并搜索单词,它会告诉我是否有这个词。我创建了(很好地使用了别人的教程)一个会在记事本文件中搜索单词,如果它找到一个,它会告诉我它是什么。但问题是,它允许我搜索一次然后关闭。有没有办法让它搜索,然后问我是否想再次搜索。我不熟悉Python,所以这可能听起来很愚蠢。哦,到目前为止,这是我的代码

tDict = {} # translation dictionary

with open("Lexicon.txt", "r") as infile:    
    for line in infile:    
        s = line.split()    
        tDict[s[0]] = s[1]
wordIn = input("Enter the English word(s) to be translated: ") #raw_input() in older Python    
words = wordIn.split()    
for word in words:    
    if word in tDict.keys():    
        print(tDict[word])    
    else:    
        print("*" + word) # the word doesn't have a translation
input()

我把输入()放在最后,这样我就必须在关闭之前点击回车。我怎么能把它放到一个循环中,这个循环会一直问我同样的问题并显示结果直到我关闭窗口?

2 个答案:

答案 0 :(得分:3)

您正在寻找的是while循环。查看下面的函数gopig,了解如何使用它。

请注意,对于piglatin translator,你可以做一些像这样的乐趣...首先使用deque,这是一个双向链表......然后是列表理解,一次处理一行...然后你在函数中有while循环,所以你可以随时“去猪”。

>>> def piglatinize(word):
...     from collections import deque
...     d = deque(word)
...     d.rotate(-1)
...     d.append('ay')
...     return ''.join(d)
... 
>>> def pigline(line):
...     return ' '.join(piglatinize(word) for word in line.strip().split())
... 
>>> def gopig():
...     while True:
...         line = input('Type a line to translate: ')
...         if not line: break
...         print pigline(line)
... 
>>> gopig()
Type a line to translate: "hello from a pig"
ellohay romfay aay igpay
Type a line to translate: ""
>>>

然后,如果你想建立一个翻译字典,那么将while循环中的上述函数替换为下面的函数。

>>> pigdict = {}
>>> def piglate(line):
...     [pigdict.update({word:piglatinize(word)}) for word in line.strip().split()]
... 
>>> piglate('hello from mars')
>>> piglate('hello from venus and earth')
>>> pigdict
{'and': 'ndaay', 'from': 'romfay', 'mars': 'arsmay', 'earth': 'artheay', 'venus': 'enusvay', 'hello': 'ellohay'}

此外,如果您正在寻找一种简单的方法来查找您是否有这个词,您可以在翻译词典上使用get。如您所愿,“{missing”值的*返回也会在下面使用。

>>> def pigfetch(word):      
...     return pigdict.get(word, '*'+word)
... 
>>> pigfetch('hello')
'ellohay'
>>> pigfetch('help')
'*help'
>>> piglate('help')
>>> pigfetch('help')
'elphay'

总而言之,你有这个:

>>> def lookpig():
...     while True:
...         line = input('Type a word to find the translation: ')
...         if not line: break
...         print pigfetch(word)
...
>>> with open('words.txt', 'r') as f:
...     [piglate(line) for line in f]
...
>>> lookpig()
Type a word to find the translation: "hello"
ellohay
Type a word to find the translation: "goodbye"
*goodbye
Type a word to find the translation: ""
>>>

如果您已经拥有一个基于文件的单词数据库,其中英语单词为first,而Piglatin单词为second,则可以执行以下操作:

>>> with open('lexicon.txt', 'r') as f:
...     pigdict.update(dict(line.strip().split() for line in f))
...
>>> lookpig()
Type a word to find the translation: "mars"
arsmay
Type a word to find the translation: "saturn"
*saturn
Type a word to find the translation: ""
>>>

虽然,存储python dict而不是带有一段未翻译和翻译的单词的文本文件可能更容易。甚至更好,使用实际的数据库。

答案 1 :(得分:1)

基本上将整个逻辑放在“while True”语句中。并且,如果您在下面的示例中输入“exit”,程序将停止(使用“break”)。

tDict = {}

with open("Lexicon.txt", "r") as infile:    
  for line in infile:
    s = line.split()
    tDict[s[0]] = s[1]

while True:
  wordIn = input("Enter the English word(s) to be translated (enter 'exit' to stop the program): ")

  if wordIn == "exit": break

  words = wordIn.split()
  for word in words:
    if word in tDict.keys():
      print(tDict[word])
    else:
      print("*" + word)