Пока цикл не зацикливается и не сохраняется в словаре

#python #while-loop

Вопрос:

Каждый раз он будет возвращать один последний элемент, введенный из входных данных. Я новичок в кодировании и python, извините, если это глупый вопрос.

 cars = {}

while True:
   models = input('Please enter car model name: ')
   colors = input('Please enter car color: ')
   cars[models] = colors
   another = input('Do you want to register another car? (y/n): ')
   if another == 'y':
       continue
   else:
       break

print(cars)
 

Он возвращается:

 Please enter car model name: bmw
Please enter car color: red
Do you want to register another car? (y/n): y
Please enter car model name: bmw
Please enter car color: blue
Do you want to register another car? (y/n): y
Please enter car model name: merc
Please enter car color: black
Do you want to register another car? (y/n): n
{'bmw': 'blue', 'merc': 'black'}
 

Он не вернул {«bmw»:»красный»}

Комментарии:

1. Блок, который начинается another = и заканчивается, break должен иметь отступ, чтобы находиться внутри цикла while.

2. Извините, отредактировал сообщение. Другой= имеет отступ в моем коде.

3. По — моему, все в порядке. Я запустил ваш код и получил словарь с несколькими автомобилями и цветами (после ввода нескольких автомобилей и цветов). Если вы хотите иметь возможность иметь автомобили одной модели, но разных цветов, я бы предложил сделать это списком кортежей вместо словаря.

Ответ №1:

Я думаю, что вы хотите сохранить несколько цветов для каждой представленной модели?

В этом случае рассмотрите возможность использования добавления списка вместо присвоения значения.

 from collections import defaultdict

cars = defaultdict(list)

while True:
   model = input('Please enter car model name: ')
   color = input('Please enter car color: ')
   cars[model].append(color)

   another = input('Do you want to register another car? (y/n): ')
   if another != 'y':
      break

print(cars)
 

В случае, если вы хотите сохранить список наборов «модель, цвет», используйте список вместо dict, так как dict может хранить только одно (последнее) значение для одного и того же ключа.

 cars = []

while True:
   model = input('Please enter car model name: ')
   color = input('Please enter car color: ')
   cars.append([model, color])

   another = input('Do you want to register another car? (y/n): ')
   if another != 'y':
      break

print(cars)
 

Если вы объедините один из вариантов с какой-либо структурой (например NamedTuple , или Dataclasses , у вас может быть более структурированный список с именованными свойствами

Ответ №2:

Если вы введете одну и ту же модель несколько раз, предыдущий цвет для этой модели будет перезаписан в словаре. Это связано с тем, что словарь сохранит только одно значение для данного ключа.

Попробуйте использовать разные модели, и у вас будет несколько пар ключ/значение.

 Please enter car model name: ford
Please enter car color: blue
Do you want to register another car? (y/n): y
Please enter car model name: chevy
Please enter car color: red
Do you want to register another car? (y/n): n
{'ford': 'blue', 'chevy': 'red'}
 

Ответ №3:

 cars = {}
def inputcars():
    models = input('Please enter car model name: ')
    colors = input('Please enter car color: ')
    cars[models] = colors
    another = input('Do you want to register another car? (y/n): ')
    if another == 'y':
        inputcars()


inputcars()
print(cars)

Please enter car model name: ford
Please enter car color: red
Do you want to register another car? (y/n): y
Please enter car model name: subaru
Please enter car color: blue
Do you want to register another car? (y/n): n
{'ford': 'red', 'subaru': 'blue'}
 

Комментарии:

1. как это отвечает на вопрос?

2. исходный код был нарушен из-за отступа за пределами цикла while, я предоставил альтернативу