For不会在Python中迭代整个列表

For不会在Python中迭代整个列表,python,Python,因此,我正在学习Python,而我设计的这个小程序却遇到了麻烦,我试图进一步提高我的编解码器和技能 car_models = ["Ferrari", "Lamborghini", "Aston Martin", "BMW"] bad_cars = ["Toyota", "Mazda", "Ford", "Hyundai"] for gcar, bcar in zip(car_models, bad_cars): ask = input("What is your favorite ca

因此,我正在学习Python,而我设计的这个小程序却遇到了麻烦,我试图进一步提高我的编解码器和技能

car_models = ["Ferrari", "Lamborghini", "Aston Martin", "BMW"]
bad_cars = ["Toyota", "Mazda", "Ford", "Hyundai"]

for gcar, bcar in zip(car_models, bad_cars):
    ask = input("What is your favorite car brand? ")
    if ask == gcar:
        print("Yes!")
    elif ask == bcar:
        print("Ew!")
    else:
        print("The model is not listed")
    break
当我运行此操作时,只有当模型是列表中的第一个模型时,它才会弹出一个答案,否则,它只会告诉您该模型未列出,即使它已列出。

break语句是错误的,您必须仅在找到对象时才完成循环

编辑,感谢@PM 2Ring

ask = input("What is your favorite car brand? ")
for gcar, bcar in zip(car_models, bad_cars):

    if ask == gcar:
        print("Yes!")
        break here
    elif ask == bcar:
        print("Ew!")
        break here
此外,您可能希望找到一个变量,以了解您的模型是否在列表中

可能的解决办法

您可以使用obj in list检查对象是否在列表中,以便执行以下操作:

ask = input("What is your favorite car brand? ")

if ask in car_models:
    print("Yes!")
elif ask in bad_cars:
    print("Ew!")
else:
    print("The model is not listed")

希望能有所帮助。

您的问题可能应该在中而不是在堆栈溢出中提出,但让我来给您详细介绍一下您实际编写的代码

car_models = ["Ferrari", "Lamborghini", "Aston Martin", "BMW", "Opel"]
bad_cars = ["Toyota", "Mazda", "Ford", "Hyundai"]
这将创建两个单独的列表,一个是好车,另一个是坏车

首先,你们要创建好车和坏车之间的链接元组。也就是说,法拉利与丰田相连,兰博基尼与马自达相连,等等。然后创建一个循环,在其中分解刚刚创建的元组,对于每个迭代,将好的和坏的car存储在gcar和bcar中

然后在循环中,你认为你要求你最喜欢的汽车品牌,并储存它。但您在这里实际要做的是请求输入,然后将其作为python代码进行计算,请参阅。也就是说,要按原样使用,您必须进入法拉利以避免名称错误异常

    if ask == gcar:
        print("Yes!")
    elif ask == bcar:
        print("Ew!")
    else:
        print("The model is not listed")
然后测试刚刚输入的汽车是否与当前的gcar或bcar迭代匹配,如果匹配,则打印一条消息。此代码不针对汽车列表进行测试,只针对当前迭代进行测试

    break
然后,在第一次迭代中进行测试之后,您将打破循环

可能的解决办法 根据您的主要目的,有两种稍微不同的修复方法。你是想一直要求新的车型,直到他们累了,还是只要求一次

在解决该问题之前,请尝试以下代码,以查看for loop产生了什么。我添加了欧宝,但它会消失,因为其他列表不够长:

car_models = ["Ferrari", "Lamborghini", "Aston Martin", "BMW", "Opel"]
bad_cars = ["Toyota", "Mazda", "Ford", "Hyundai"]

for gcar, bcar in zip(car_models, bad_cars):
    print('gcar = {}, bcar = {}'.format(gcar,bcar))
假设你想问多次,你可以这样做:

car_models = ["Ferrari", "Lamborghini", "Aston Martin", "BMW", "Opel"]
bad_cars = ["Toyota", "Mazda", "Ford", "Hyundai"]

while True:
    ask = raw_input("What is your favorite car brand? ")
    if ask in car_models:
        print("Yes!")
    elif ask in bad_cars:
        print("Ew!")
    else:
        print("The model is not listed")
        break
请注意对使用原始输入的更改,以及while True:继续询问,直到给出未列出的车型。请注意额外的中断缩进,以便仅当您在两个列表中都没有列出一辆汽车时,才会执行此操作

这可能会产生以下“对话框”:

What is your favorite car brand? Ferrari
Yes!
What is your favorite car brand? Toyota
Ew!
What is your favorite car brand? Mazda
Ew!
What is your favorite car brand? Lamborghini
Yes!
What is your favorite car brand? Saab
The model is not listed

中断中断for循环。所以,当你第一次到达循环的末尾时,你就跳出了循环,代码的逻辑就是这样。您觉得它的哪一部分行为令人困惑?我认为您不了解循环是如何工作的。在每次循环迭代结束时,您正在迭代的变量将移动到列表中的下一个值,但由于您在循环结束时中断,因此您的循环只运行一次,因此您只在第一个索引中进行迭代。您为什么在循环内问这个问题?为什么在这里有中断?你是说在这里休息吗?还有,为什么在for循环中有输入调用?@PM2Ring是的,输入应该在外部,这里只是一个参考,我将注意力放在可能的解决方案中,因为我认为这是一种更好的方法
car_models = ["Ferrari", "Lamborghini", "Aston Martin", "BMW", "Opel"]
bad_cars = ["Toyota", "Mazda", "Ford", "Hyundai"]

while True:
    ask = raw_input("What is your favorite car brand? ")
    if ask in car_models:
        print("Yes!")
    elif ask in bad_cars:
        print("Ew!")
    else:
        print("The model is not listed")
        break
What is your favorite car brand? Ferrari
Yes!
What is your favorite car brand? Toyota
Ew!
What is your favorite car brand? Mazda
Ew!
What is your favorite car brand? Lamborghini
Yes!
What is your favorite car brand? Saab
The model is not listed