Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 16, 2014 12:43:57

nonamez
Зарегистрирован: 2014-03-07
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсия в питоне

Набросал тут небольшую функцию по примерам из интернета, но возникли проблемы с рекурсией…

def toSimpleXml(data, wrap = False):
	result = list()
	input_data_type = type(data)
	if input_data_type is list:
		for sub_element in data:
			result.append(toSimpleXml(sub_element))
		return ''.join(result)
	elif input_data_type is dict:
		for tag_name in data:
			sub_element = data[tag_name]
			result.append('<%s>' % tag_name)
			result.append(toSimpleXml(sub_element))
			result.append('</%s>' % tag_name)
		return ''.join(result)
	
	if wrap:
		return '<%s>%s</%s>' % (wrap, data, wrap)
	
	return data
data = [{'element_1': 'value_1'}, {'element_2': {'element_2_1': 'value_2_1'}}]
print toSimpleXml(data, 'root')

По идее оно всё должно врапнуть ещё и роот тэгом, но не врапает…

Офлайн

#2 Апрель 17, 2014 07:36:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Рекурсия в питоне

>>> def toSimpleXml(data, wrap=None):
...     out = data
...     result = []
...     input_data_type = type(data)
...     if input_data_type is list:
...         for sub_element in data:
...             result.append(toSimpleXml(sub_element))
...         out =  ''.join(result)
...     elif input_data_type is dict:
...         for tag_name in data:
...             sub_element = data[tag_name]
...             result.append('<%s>' % tag_name)
...             result.append(toSimpleXml(sub_element))
...             result.append('</%s>' % tag_name)
...         out =  ''.join(result)
...     else:
...         assert input_data_type is str, 'not a string'
...     if wrap is not None:
...         return '<%s>%s</%s>' % (wrap, out, wrap)
...     return out
... 
>>> data = [{'element_1': 'value_1'}, {'element_2': {'element_2_1': 'value_2_1'}}]
>>> print toSimpleXml(data, 'root')
<root><element_1>value_1</element_1><element_2><element_2_1>value_2_1</element_2_1></element_2></root>
>>> 
>>> print toSimpleXml(1, 'root')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 17, in toSimpleXml
AssertionError: not a string
>>>

также надо помнить, что у словаря произвольный порядок элементов



Отредактировано py.user.next (Апрель 17, 2014 07:42:18)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version