Python: цикл по списку - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над последовательностью, которая проходит по списку и задает пользователю вопрос о каждом из элементов в списке. В зависимости от ответа последовательность должна выполнить 1 из 3 вещей:

1. Continue on to the next item
2. Delete the item at the present index
3. Display and error message, restart

Пока я получил цикл для работы почти , как мне нужно, но он все еще не работает так, как мне хотелось бы, и я не уверен, где я нахожусь что-то не так.

Вот что у меня есть:

fruit_list = ["Apples", "Pears", "Oranges", "Peaches"]
item = 1
while item < len(fruit_list):

    for val in fruit_list:

        user_resp = input("Do you like " + str(val) + "? ")
        print()
        if user_resp != "yes" and user_resp != "no":
            print("Please only answer with 'yes' or 'no'.")
            item+=1
            break
        elif user_resp == "yes":
        item+=1
            continue
        elif user_resp == "no":
            fruit_list.remove(val)
            item+=1
            continue

У меня есть следующие вопросы / вопросы:

  1. Я использовал переменную "item", чтобы попытаться ограничить цикл while циклами, пока все элементы в списке не будут циклически повторены, но если пользователь вводит неправильный ответ, я хочу продолжать спрашивать тот же вопрос, пока они не ответят «да» или «нет». То, что у меня сейчас есть, просто выходит из цикла, если ответ не «да» или «нет».

  2. Когда пользователь вводит «нет», последовательность должна удалить индекс / значение для элемента, который только что был показан пользователю, а затем отобразить значение следующего индексированного элемента, но вместо того, что я удаляет элемент, но он также отображает значение после следующего индекса (т. е. если вы удалили «Яблоки» из списка, вместо того, чтобы отображать «Груши» далее, он отобразит «Апельсины»).

Есть какие-нибудь мысли / предложения о том, как это оптимизировать?

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

если вы просто создаете копию списка, вы можете избежать дополнительного цикла while. Обратите внимание, что вам нужно создать копию списка, list(fruits), если вы просто сделаете fruits_copy = fruits, он укажет на тот же список и создаст проблему.

fruits = ["Apples", "Pears", "Oranges", "Peaches"]
fruits_copy = list(fruits)

for fruit in fruits:

    user_resp = raw_input("Do you like " + fruit + "? ")
    if user_resp.lower() == "yes":
        continue
    elif user_resp.lower() == "no":
        fruits_copy.remove(fruit)
    else:
        print("Please only answer with 'yes' or 'no'.")
        break

print fruits_copy
print fruits
0 голосов
/ 16 мая 2018

Нет необходимости копировать или создавать другой список, ваша проблема в функции удаления

fruit_list = ["Apples", "Pears", "Oranges", "Peaches"]                                                                                                                            

counter = 0

while True:
   if not len(fruit_list) or counter >= len(fruit_list):
       break

   for i, val in enumerate(fruit_list):
       user_resp = input("Do you like " + str(val) + "? ")
       if user_resp == "yes":
           counter += 1
           continue
       elif user_resp == 'no':
           fruit_list.pop(i)
           continue
       else:
           print("Please only answer with 'yes' or 'no'.")
           break

~

0 голосов
/ 16 мая 2018

Я думаю, что проблема в том, что вы пытаетесь перебрать список, используя индекс, но после удаления одного из элементов в списке индекс перестает быть корректным. Это может сработать, если вы просто удалите элемент + = 1, если пользователь ответит «нет». Однако, если бы я это сделал, я бы сделал что-то вроде этого:

fruit_list = ["Apples", "Pears", "Oranges", "Peaches"]
liked_fruits = []

for fruit in fruit_list:
    while True:
        user_resp = input("Do you like " + fruit + "?: ").lower()
        print()
        if user_resp != "yes" and user_resp != "no":
            print("Please only answer with 'yes' or 'no'.")
        elif user_resp == "yes":
            liked_fruits.append(fruit)
            break
        else:
            break
print(liked_fruits)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...