Python:通过List循环

时间:2018-05-16 19:28:25

标签: python python-3.x list for-loop while-loop

我正在处理循环列表的序列,并询问用户有关列表中每个项目的问题。根据答案,序列应该做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. 我使用变量&#34; item&#34;尝试将while循环限制为循环,直到列表中的所有项目都循环通过,但如果用户输入了错误的答案,我希望能够继续问同样的问题,直到他们回答“是”和“#34 ;或&#34;不&#34;。如果答案不是&#34;是&#34;我现在所拥有的只是突破了循环。或&#34;不&#34;。

  2. 当用户输入&#34; no&#34;序列应该删除刚刚显示给用户的项目的索引/值,然后显示下一个索引项目的值,而不是我所做的删除项目,但它也会显示下一个索引之后的值(即,如果您从列表中删除&#34; Apples&#34;而不是显示&#34; Pears&#34;接下来,它会显示&#34;桔子&#34;。)

  3. 有关如何优化此事的任何想法/建议?

3 个答案:

答案 0 :(得分:1)

我认为问题在于您尝试使用索引遍历列表,但是一旦删除列表中的某个项目,索引就不再正确。如果您只是删除项目+ = 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)

答案 1 :(得分:0)

如果你只是创建一个列表副本,你可以避免额外的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

答案 2 :(得分:0)

无需复制或创建其他列表,您的问题在于删除功能

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