@fantom_ask

Как вывести все значения из многомерного словаря?

У меня есть словарь который который может менятся в размерах и количество вложенных в него других
словарей может брать разным.

arr = {
'1':{
	'id': 1,
	'name': 'test_1',
	'child': {
		'2':{
		'id': 1,
		'name': 'test_2',
		'child': {
			'3':{
				'id': 3,
				'name': 'test_3',
				'child': {}
			}
		}
		
		}
	
	}
},
'4':{
  'id': 4,
  'name': 'test_4',
  'child': {}
}
}


Но я не понимаю как создать цикл который выведет все значения в таком формате

<ul>
	<ul>
		<li>
			test_1
		</li>
		<ul>
			<li>
				test_2
			</li>
			<ul>
				<li>
					test_3
				</li>
			</ul>
		</ul>
	</ul>

	<ul>
		<li>
			test_4
		</li>
	</ul>
</ul>

Писать постояно
html = "<ul>"
for x in arr:
	html = html + "<ul>"
	val_1 = arr[x]['name']
	html = html + "<li>" + val_1 + "</li>"
	for y in arr[x]['child'] :
		html = html + "<ul>"
		val_2 = arr[x]['child'][y]['name']
		html = html + "<li>" + val_2 + "</li>"
		for b in arr[x]['child'][y]['child'] :
			html = html + "<ul>"
			val_3 = arr[x]['child'][y]['child'][b]['name']
			html = html + "<li>" + val_3 + "</li>"
			html = html + "</ul>"
		html = html + "</ul>"
	html = html + "</ul>"
html = html + "</ul>"
print(html)

Мне не подходит
Как в python решают такие задачи?

В качестве аналогии могу привести get_comments() из wordpress.

Я не могу понять как у нее получается вкладывать комментарий в друг друга не зависимо от количества вкладывания. одним циклом

Единственное что у меня получается это
<ul>
	<li>
		test_1
	</li>
	<li>
		test_2
	</li>
	<li>
		test_3
	</li>
	<li>
		test_4
	</li>
</ul>
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
@skayer
Python software engineer
В приведенном вами словаре на первом уровне одини и те же ключи (id, name, child) повторяются 2 раза и перезаписываются.

Но в общем случае я бы для такой задачи написал рекурсивную функцию.
Например:
def print_recursive(data, offset=''):
    def is_leaf(element):
        return not bool(element.get('child'))

    if is_leaf(data):
        print(offset + '<li>')
        print(offset + data.get('name'))
        print(offset + '</li>')
        return

    print(offset + '<ul>')
    print_recursive(data['child'], offset=offset + '    ')
    print(offset + '</ul>')

arr = {}  # тут ваш словарь
print_recursive(arr)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
0ralo
@0ralo
Python backend developer
Возможно библиотека pprint поможет
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы