2017-02-16 23 views
1

Я новый в программировании на Python и не мог решить следующую проблему в течение нескольких часов. У меня есть пример файла, который содержит четыре строки. Я хочу получить два входа от пользователя к моменту его нахождения в строке файла, однако мои петли, похоже, не повторяются по всем строкам. Это содержимое файла, элементы разделены пробелом:Python while loop iteration не работает

Google 1 2 
Apple 13 17 
Microsoft 22 8 
Verizon 6 15 

и это один мой код:

import sys 
with open('manylines.txt','r') as myfile: 
    results = [line.split() for line in myfile] 

    for i in results: 
     print(i) 


     term1=input("Enter the first term:") 
     while term1 not in i : 
      print("Term not found,please try again:") 
      term1 = input("Enter the first term:") 

     term2 = input("Enter the second term:") 
     while term2 not in (i) : 
      print("Term not found,please try again:") 
      term2 = input("Enter the second term:") 
     print(i) 
     print(i) 
     sys.exit() 

Я хочу, чтобы ввести например Google и Microsoft и получить следующий вывод:

['Google','1','2'] 
['Microsoft','22','8'] 

как два списка. Однако мой код находит только первую строку, а не другие. Не могли бы вы рассказать мне, почему он не перебирает другие строки, пожалуйста. Как это исправить? Заранее спасибо!

+0

Каковы ваши значения для первого и второго сроков? – lmiguelvargasf

+2

Ваш вызов 'sys.exit' внутри вашего цикла for, поэтому программа всегда будет завершена на первой итерации. –

+0

значения, например, Google и Microsoft @lmiguelvargasf –

ответ

0

Вот то, что не меняет код с попытки резко ... Это делает использование lower() и title() для обеспечения различной капитализации-х пользовательского ввода:

import sys 

with open('data.txt','r') as f: 
    results = [line.split() for line in f] 

while True: 
    found = False 
    term = input("Enter a company to search or type exit: ") 
    if term.lower() == "exit": 
     break 
    for record in results: 
     if record[0] == term.title(): 
      print(record) 
      found = True 
      break 
    if not found: 
     print("Term not found, please try again...") 

print("Goodbye!") 
sys.exit(0) 

Примера использование:

Enter a company to search or type exit: Google 
['Google', '1', '2'] 
Enter a company to search or type exit: microsoft 
['Microsoft', '22', '8'] 
Enter a company to search or type exit: Amazon 
Term not found, please try again... 
Enter a company to search or type exit: Exit 
Goodbye! 

Вот как вы можете только предложить пользователю только «два срока»:

out1, out2 = [], [] 
term_count = 1 
while term_count < 3: 
    found = False 
    term = input("Enter term %d or type exit: " % term_count) 
    if term.lower() == "exit": 
     break 
    for record in results: 
     if term_count == 1 and record[0] == term.title(): 
      print(record) 
      out1 = list(record) 
      found = True 
      term_count += 1 
      break 
     if term_count == 2 and record[0] == term.title(): 
      print(record) 
      out2 = list(record) 
      found = True 
      term_count += 1 
      break 
    if not found: 
     print("Term not found, please try again...") 

Пример:

Enter term 1 or type exit: Amazon 
Term not found, please try again... 
Enter term 1 or type exit: Google 
['Google', '1', '2'] 
Enter term 2 or type exit: Microsoft 
['Microsoft', '22', '8'] 
Goodbye! 
+0

Большое спасибо @ shash678. Еще одна вещь, которую я хотел бы задать. Я хочу запросить только два входа, как показано в моем коде. Не могли бы вы показать, как это сделать? Я имею в виду, что один раз он проверяет наличие двух входов, и когда он получает эти два найденных элемента, он печатает эти два соответствующих списка, как вы показали, так и выходы программы.Не могли бы вы показать это, пожалуйста? –

+0

@python_beginner см. Мой обновленный ответ – shash678

+0

Спасибо @ shash678. Последнее, что я хотел бы спросить. Это примерно то, что я ищу, но возможно ли, что я назначаю для них две переменные. Я имею в виду, если Google обнаружит, назначьте выходные данные ['Google', '1', '2'], чтобы мы сказали, чтобы вывести1 и назначить вывод Microsoft ['Microsoft', '22', '8'] в out2. Я имею в виду, что хотел бы получить их как два списка, а затем использовать их в других частях программы для дальнейших целей. Как это можно сделать? Я очень ценю вашу большую помощь! –

0

Попробуйте следующий код. Этот код определяет, какой термин найден и запрашивает термин, который не найден.

Вы не правильно делаете свою петлю. Когда ваш цикл выполняется в первый раз, у него есть Google, а term1 содержит Google, а term2 содержит Microsoft. Таким образом, он печатает Google и после этого вы сгибаете выполнение, используя sys.exit(). Так что, конечно, он печатает первую строку, а не другие.

import sys 
with open('tempa.txt','r') as myfile: 
    results = [line.split() for line in myfile] 

NeedToExecute = 0 
term1 = False 
term2 = False 

list1 = None 
list2 = None 

while NeedToExecute != 2: 

    if(term1 != True): 
     term1 = input("Enter the first term:") 

    if(term2 != True): 
     term2 = input("Enter the second term:") 

    for i in results: 

     if term1 in i : 
      NeedToExecute = NeedToExecute + 1 
      term1 = True 
      list1 = i 
      print(i) 

     if term2 in i : 
      NeedToExecute = NeedToExecute + 1 
      term2 = True 
      list2 = i 
      print(i) 

print list1 
print list2 
+0

Спасибо @Ujjaval Moradiya за ваш ответ. Но не могли бы вы рассказать мне, как я могу назначить две переменные для этих двух списков. Скажем, первый становится list1, а второй - list2. Я хочу использовать эти списки для дальнейших целей в своей программе. Спасибо вам за помощь! –

+0

Да, вы можете это сделать. Почему ты не думаешь об этом. Это не так сложно. Проверьте мой обновленный код –

+0

Да, я понял это, определяя списки, а затем добавляя туда результаты. Большое спасибо за большую помощь! –

 Смежные вопросы

  • Нет связанных вопросов^_^