Найти - Пользователи
Полная версия: Алгоритм работы с деревьями
Начало » Python для новичков » Алгоритм работы с деревьями
1
Moroznui
Есть список, например:
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>
Я думаю, что вы поняли.
Просто мы еще к паттернам в инсте не прикасались, а гугл как-то молчит(мб не так ищу).
Заранее спасибо.
klrk
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)
Или я неправильно понял задание?
Moroznui
Правильно. Просто так я и сам умею. Думал можно красивее.
maxwell
Moroznui, вам шашечки или ехать? Можно и без рекурсии, например.
А вот какие-то «паттерны» это вряд-ли сюда.
Isem
maxwell
Можно и без рекурсии, например.
А зачем?
alexx11
Isem
По сути стандартное дерево.
Я бы сказал коряга какая-то! Типы разные, если подряд идёт …,,, - это фэйл? Вобщем какое посадишь такое и вырастит.
Isem
При чем тут Isem?
doza_and
Про генерацию текстов из деревьев можно прочитать в 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 остальное у меня библиотечка.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB