Очевидная рекурсия, кажется, работает очень хорошо, по крайней мере, на ваших примерах:
case class Node[A](a: A, children: List[Node[A]])
def trieForest[A](lists: List[List[A]]): List[Node[A]] = {
lists.filter(_.nonEmpty).groupBy(_.head).map {
case (k, vs) =>
Node(k, trieForest(vs.map(_.tail)))
}.toList
}
def fromPaths(paths: List[String]): Node[String] = {
// assumes that there is only one tree in the
// top-level forest.
trieForest(paths.map(_.split("/").toList)).head
}
println(fromPaths(List("a/b/x", "a/b/y", "a/c", "a/c/d")))
Печать (до отступа):
Node(a, List(
Node(b,List(
Node(y,List()),
Node(x,List())
)),
Node(c,List(
Node(d,List())
))
))
Она не может работать намного быстрее асимптотически, потому что вы должны смотреть на каждую часть ввода хотя бы один раз.
Помимо тех уже упомянул, что я могу добавить:
Я никогда не использовал ни одного из них также - никакие рекомендации, но, если это имеет значение, я использовал по крайней мере 2 сложных программы, созданные непосредственно на pygtk, который работал и в Windows и в Linux.
Я думаю, что новозеландец является единственным из них с испеченным в поддержке дб (через интерфейс с SQLAlchemy, SQLObject или Storm), но я был бы удивлен, не могли ли Вы использовать один из тех ORM's ни в одной из других платформ.
PyQt и его модели могут автоматизировать некоторые из этих задач для Вас (к некоторой сумме от курса, например, заполняющимся виджетам с данными из базы данных и обрабатывающий большую часть поведения виджетов, буферизовав и т.д.).
Если Вы хотите больше объектно-ориентированного подхода для обработки SQL, Вы могли бы изучить ORM-ориентированное решение (например, SQLAlchemy).
Дабо создается сверху wxPython, таким образом, Вы не можете предпочесть его, но он разработан, чтобы помочь связать GUI с базой данных, таким образом, я рекомендовал бы проверить его, если Вы уже не имеете. В частности, это имеет хорошие средства для связи виджетов к данным и обработки большого количества общих падежей разработки GUI.
wxGlade может помочь, хотя я не использовал его сам, таким образом, я не говорю на основе опыта.
У Конструктора удава, по-видимому, есть разработчик wxPython GUI в нем, и существует также PythonCard, хотя разработка на этих двух проектах, кажется, остановилась.
Черты могли бы быть хорошим вариантом для Вас. http://code.enthought.com/projects/traits/docs/html/TUIUG/index.html
AS, простой, поскольку это должно отобразить UI на объект, это не кажется слишком неправдоподобным для слияния SQLAlchemy для персистентности.
Я имел большой успех с wxPython, но это было несколько лет назад теперь и могут быть лучшие новые решения...
Существует хорошая книга по wxPython, "wxPython в Действии", которое не может быть сказано для некоторых из других решений. Никакой удар по другим. У меня была разработка успеха с wxPython в прошлом, и это идет с большим набором демонстрационных приложений с исходным кодом, у которого можно одолжить подробно.
Лучший разработчик UI, которого я нашел для wxPython приложений, является коммерческим, Антемий DialogBlocks. Это одним из wxPython программистов и стоит денег. Другие решения для дизайна UI включают wxGlade (я нашел, что это применимый, но не featureful) и Конструктор Удава (не использовали его). Крыло IDE могло бы также иметь тот. Редактор Python Stani связывает wxGlade, я верю. Существует много других проектов, которые действительно не работают или довольно стары.
Насколько автоматизация SQL идет, как другая отвечающая сторона говорит, я посмотрел бы на алхимию SQL, но кривая обучения для небольшого приложения могла бы быть слишком много, и Вы будете более обеспечены просто движение прямо к odbc. Лучший odbc API является тем, используемым Django, pyodbc.
Это было некоторое время, так как я разработал с этими инструментами, таким образом, может быть что-то более новое для каждого, но в то время, когда они были определенно лучшим среди аналогов, по-моему.
Хорошо, это нестандартное решение, но напишите себе генератор кода. Я делал это несколько раз, используя Мако . Таким образом, в моем случае я автоматически проверяю таблицу, какие столбцы она содержит, и набирает и генерирует классы из этого. Это больше предварительная работа, но она делает именно то, что вы хотите, и ее можно использовать в последующих проектах.