Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 27, 2011 12:35:33

Moroznui
От:
Зарегистрирован: 2010-10-12
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Алгоритм работы с деревьями

Есть список, например:

Dirs = ['dir1',['subdir1','subdir2'],'dir2','dir3',['subdir3',['subsubdir1',...]]]
По сути стандартное дерево.
Подскажите плиз паттерн, какорый бы “разворачивал” это дерево, например, в html:
<ul>
<li>dir1</li>
<li>
<ul>
<li>subdir1</li>
<li>subdir2</li>
</ul>
</li>
<li>dir2</li>........
</ul>
Я думаю, что вы поняли.
Просто мы еще к паттернам в инсте не прикасались, а гугл как-то молчит(мб не так ищу).
Заранее спасибо.



Отредактировано (Янв. 27, 2011 12:38:59)

Офлайн

#2 Янв. 27, 2011 12:49:53

klrk
От:
Зарегистрирован: 2011-01-26
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Алгоритм работы с деревьями

dirs = ['dir1', ['subdir1','subdir2'], 'dir2', 'dir3', ['subdir3', ['subsubdir1', 'subsubdir3', 'subsubdir3']]]

def walk(tree):
print "<ul>"
for i in tree:
print "<li>"
if type(i) is str:
print i
else:
walk(i)
print "</li>"
print "</ul>"


walk(dirs)
Или я неправильно понял задание?



Отредактировано (Янв. 27, 2011 12:51:40)

Офлайн

#3 Янв. 27, 2011 12:58:03

Moroznui
От:
Зарегистрирован: 2010-10-12
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Алгоритм работы с деревьями

Правильно. Просто так я и сам умею. Думал можно красивее.



Офлайн

#4 Янв. 27, 2011 14:00:45

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Алгоритм работы с деревьями

Moroznui, вам шашечки или ехать? Можно и без рекурсии, например.
А вот какие-то «паттерны» это вряд-ли сюда.



Офлайн

#5 Янв. 27, 2011 18:18:15

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Алгоритм работы с деревьями

maxwell
Можно и без рекурсии, например.
А зачем?



Офлайн

#6 Янв. 27, 2011 19:27:04

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Алгоритм работы с деревьями

Isem
По сути стандартное дерево.
Я бы сказал коряга какая-то! Типы разные, если подряд идёт …,,, - это фэйл? Вобщем какое посадишь такое и вырастит.



Офлайн

#7 Янв. 27, 2011 21:00:34

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Алгоритм работы с деревьями

При чем тут Isem?



Офлайн

#8 Янв. 27, 2011 21:25:26

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Алгоритм работы с деревьями

Про генерацию текстов из деревьев можно прочитать в Antlr
вот простенький генератор текстов

class EvalDict:
"""usage: "___%(ech(a,'asd'))s _____" % evaldict.EvalDict() - interpolate strings"""
def __init__(self, globals=None, locals=None):
if globals is None:
globals = sys._getframe(1).f_globals
self.globals = globals
if locals is None:
locals = sys._getframe(1).f_locals
self.locals = locals

def __getitem__(self, key):
key = key % self
return eval(key, self.globals, self.locals)

def seprp(arg,sep=","):
"make string from arg separated by sep and pepend sep"
return reduce(lambda x, y: str(x)+sep+str(y), arg,"")

def sepr(arg,sep=","):
"make string from arg separated by sep"
if len(arg)==0:
return ""
else:
return reduce(lambda x, y: str(x)+sep+str(y), arg)

def seprnl(arg):
return sepr(arg,"\n")

def ToText(ex):
if type(ex) is type(""):
return "<li>"+ ex+"</li>"
else:
return """
<ul>
%(seprnl(map(ToText,ex)))s
</ul>

""" %EvalDict()

data=['dir1',['subdir1','subdir2'],'dir2','dir3',['subdir3',['subsubdir1','asd']]]

print ToText(data)
собственно генератор это ToText остальное у меня библиотечка.



Отредактировано (Янв. 27, 2011 21:26:49)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version