Как перебрать значения в JSON и присвоить их другому словарю
Я разрабатываю веб-приложение на Python/Django. Я пытаюсь разобрать JSON в словарь python, прочитать значения в словаре и присвоить значения другому словарю, если выполняются определенные условия.
JSON структурирован следующим образом:
{content: {cars: [0, 1, 2]}, other_stuff: []}
Каждый автомобиль имеет несколько атрибутов:
0: {"make", "model", "power"...}
Каждый атрибут имеет три переменные:
make: {"value": "Toyota", "unit": "", "user_edited": "false"}
Я пытаюсь присвоить значения в JSON другим словарям; car_0, car_1 и car_2. В этом случае ответ JSON идентичен для каждого автомобиля, но "марка" первого автомобиля изменена на "Nissan", и я пытаюсь изменить марку автомобиля_0 также на "Nissan". Я разбираю JSON следующим образом:
local_cars = [car_0, car_1, car_2] # Dictionaries which are already initialized.
print(local_cars[0]['make']['value']) # Prints: Toyota (yes)
print(local_cars[1]['make']['value']) # Prints: Toyota (yes)
print(local_cars[2]['make']['value']) # Prints: Toyota (yes)
counter = 0
if request.method == 'POST':
payload = json.loads(request.body)
if bool(payload):
print(len(local_cars)) # Prints: 3
print(counter, payload['cars'][0]['make']['value']) # Prints: Nissan (yes)
print(counter, payload['cars'][1]['make']['value']) # Prints: Toyota (yes)
print(counter, payload['cars'][2]['make']['value']) # Prints: Toyota (yes)
print(counter, local_cars[0]['make']['value']) # Prints: Toyota (yes)
print(counter, local_cars[1]['make']['value']) # Prints: Toyota (yes)
print(counter, local_cars[2]['make']['value']) # Prints: Toyota (yes)
for target_car in payload['cars']: # Loop through all three cars in payload
print(counter, local_cars[counter]['make']['value']) # Prints: 0, Toyota (yes), 1, Nissan (no!), 2, Nissan (no!)
for attr in target_car.items(): # Loop through all key:dict pairs of a single car
attribute_key = attr[0] # Key (eg. 'make')
vars_dict = attr[1] # Dictionary of variables ('value': 'xx', 'unit': 'yy', 'user_edited': 'zz')
if vars_dict['user_edited'] == 'true':
local_cars[counter][attribute_key]['user_edited'] = 'true'
local_cars[counter][attribute_key]['value'] = vars_dict['value']
counter = counter + 1
Я не понимаю, почему другие автомобили, local_cars[1] и local_cars[2], каким-либо образом затронуты в этом цикле. Как видно, по какой-то причине их 'make' меняется на 'Nissan', хотя в теле запроса было 'Toyota'. Похоже, что это происходит в первом цикле 'for target_car in payload['cars'].
Отказ от цикла/счетчика и фокусировка на одном автомобиле не имеет никакого значения:
for target_car in payload['cars']: --> target_car = payload['cars'][0]:
...
local_cars[0][attribute_key]['user_edited'] = 'true'
local_cars[0][attribute_key]['value'] = vars_dict['value']
Что я делаю неправильно? Как могут быть затронуты car_1 и car_2, даже если я изменю единственную часть кода, где редактируются любые значения в этих словарях, чтобы они влияли только на local_cars[0]?
Я думаю, что вы, вероятно, не умеете снимать копии car_0 и т.д. Не забывайте, что присвоение в python - это чисто привязка к имени.
x = car_0
y = car_0
print( x['make']['value'] ) # 'Toyota'
print( y['make']['value'] ) # 'Toyota'
print( x is y ) # True. Both names refer to the same object
x['make']['value'] = 'foo'
print( y['make']['value'] ) # 'foo'
Должно было быть y = car_0.copy() или даже y=car_0.deepcopy().
Я не совсем понимаю ваш код, но если вы все еще не уверены, то проведите is тестирование, чтобы выяснить, какие сущности привязаны к одному объекту (и не должны быть).