#python #json #if-statement #parsing
Вопрос:
В многомерном JSON ниже я извлек значения «ширина» и «высота», которые я хочу добавить в пустую таблицу/массив и использовать их позже для вычислений. В следующем JSON.
[
{
"frame_id":1,
"filename":"bake/IMG_20210930_090024.jpg",
"objects": [
{"class_id":0, "name":"brick", "relative_coordinates":{"left_x":1279, "top_y": 991, "width": 922, "height":1164},"relevant":true}
]
},
{
"frame_id":2,
"filename":"bake/IMG_20210930_090017.jpg",
"objects": [
{"class_id":1, "name":"limestone", "relative_coordinates":{"left_x":1672, "top_y":1536, "width": 651, "height": 623},"relevant":true}
]
}
]
Мой код и результат:
with open('/home/pan/output/result.json') as json_data:
data = json.load(json_data)
for item in data:
for row in item.get('objects', []):
print(row['class_id'], row['relative_coordinates']['width'],row['relative_coordinates']['height'])
0 922 1164
1 651 623
Мой главный вопрос заключается в том, что я хотел бы показать результаты только для «class_id»:0 для ширины и высоты.
Кроме того, каков наилучший способ добавить эти значения через консоль или пустой массив[] и выполнить вычисления позже?
Ответ №1:
Вы можете попробовать это:
value_list = []
with open('result.json') as json_data:
data = json.load(json_data)
for item in data:
for row in item.get('objects', []):
if row['class_id'] == 0:
print(row['class_id'], row['relative_coordinates']['width'], row['relative_coordinates']['height'])
value_list.append(row['relative_coordinates']['width'])
value_list.append(row['relative_coordinates']['height'])
print(value_list)
Выход:
0 922 1164
[922, 1164]
Комментарии:
1. Лучше иметь
for item in data
отдельный цикл, чтобы нам не приходилось держать файл открытым после того, как мы получим из него данные.2. Я просто стараюсь сохранить код таким, какой он есть, вот почему пишу так, иначе мы можем прочитать файл с помощью переменной и сделать все остальное с этой переменной. 🙂
Ответ №2:
Вы получаете доступ к своим данным, просматривая диктанты и списки один за другим.
width = -1
height = -1
for item in data:
if item['objects'][0]['class_id'] == 0:
width = item['objects'][0]['relative_coordinates']['width']
height = item['objects'][0]['relative_coordinates']['height']
break
Комментарии:
1. Это просто неправда. Я проверяю все пункты во внешнем списке.
Ответ №3:
Простое добавление if
условия в ваш код даст ожидаемые результаты, как показано ниже:
data = None
with open('/home/pan/output/result.json') as json_data:
data = json.load(json_data)
co_ordinates = []
for item in data:
for row in item.get('objects', []):
if row['class_id'] == 0:
co_ordinates.append(row['relative_coordinates']['width'])
co_ordinates.append(row['relative_coordinates']['height'])
break
print (co_ordinates)
Выход:
[922, 1164]