@pcdesign

Как максимально эффективно вычислить индекс элемента во вложенной структуре?

Вот структура

my_list = {"groups":[
	{
		"descr":"3 светильника из профиля Люкс",
		"zones":[
			{
				"id":"2dd1fd73-7ed5-41be-90f3-2ff904f7b600",
				"descr":"Профиль 4970, 4-х рядная лента, управление."
			}
		],
		"id":"93145ca7-f284-46d2-98ed-ad187ad3b996"
	},
	{
		"descr":"6, жилая комната",
		"zones":[
			{
				"id":"f0621e80-ecc9-4148-a689-c7c36e416ce0",
				"descr":"Лента, блок"
			},
			{
				"id":"083721b6-a8b7-470a-8162-6399e0cd90e2",
				"descr":"Лента,блок"
			}
		],
		"id":"de1b4ad5-6f07-473b-88bc-fe2f93cfbafb"
	},
	{
		"descr":"5,жилая комната",
		"zones":[
			{
				"id":"3441ef59-bf85-4303-a4cc-6105cdf4cf9a",
				"descr":"Лента,блок"
			}
		],
		"id":"b6d76ada-2c40-45bb-8ad6-295a579aad9e"
	},
	{
		"descr":"4,жилая комната",
		"zones":[
			{
				"id":"c4973844-76c4-479f-a5ac-1298e5dd6259",
				"descr":"Лента,блок"
			},
			{
				"id":"2068c560-2255-4487-bf5c-0904b830227f",
				"descr":"Лента,блок"
			}
		],
		"id":"24a8fb7e-68ac-42f5-8217-b9315a407535"
	}
]
}



Например, мне нужно найти индекс элемента с определенным ID и с определенным ID родителя.

Тогда решение в лоб вот такое:
for row in my_list['groups']:
    if row['id'] == 'de1b4ad5-6f07-473b-88bc-fe2f93cfbafb':
        for i, item in enumerate(row['zones']):
            if item['id'] == '083721b6-a8b7-470a-8162-6399e0cd90e2':
                print('index=', i)


Есть вариант сделать это лучше?
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 2
@barolina
turn coffee into code
nested-lookup
или
рекурсией
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Если структуру данных строишь один раз, а потом ваыполняешь к ней ряд таких запросов, может иметь смысл пройтись по всей структуре циклом и построить словарь следующего вида.
Ключ: кортеж (id_родителя, id_элемента)
Значение: данные элемента

Тогда при запросе можно будет сконструировать такой же кортеж, а потом проверить его наличие в словаре или извлечь элемент из словаря.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы