Я хочу взять список вроде следующего:Рекурсивные функции сортировки для списка в Python
groups = ["foo", "bar", "foo::fone", "foo::ftwo", "foo::ftwo::ffone"]
И превратить его в вложенный список, вероятно, в следующем формате, но я открыт для предложений:
groups_sorted = [{
"name":"foo",
"children": [
{
"name": "foo::fone",
"children": [ ... ]
}, ...
]
}, ...
]
Чтобы список сортировался по иерархии, разбитой на ::
. Мне нужно, чтобы каждый из ключей children
составлял списки, так как исходный порядок списка важен.
Я играл в течение нескольких часов и смог создать рекурсивный словарь, начиная с одного верхнего узла, но я не мог сделать последний бит. Найти мои разработки ниже:
def children_of(node, candidates):
children = []
remainder = []
for c in candidates:
sub = node + "::"
if c.startswith(sub):
try:
c[len(sub):].index("::") # any more separators = not a child
remainder.append(c)
except ValueError: # a child
children.append(c)
else: #not related
remainder.append(c)
return children, remainder
def sortit(l):
if l:
el = l.pop(0)
children, remainder = children_of(el,l)
if children:
return { "name": el,
"children": [sortit([c]+remainder) for c in children]
}
else:
return { "name": el }
Редактировать: решение @Thijs Ван Дьен действительно хорош, но мне нужно 2.6 совместимость, которая мешает мне некоторые с помощью OrderDicts.
Спасибо - жаль, что это фантастический ответ, но я не могу использовать OrderedDicts, как мы используем Python 2.6 –
@IanClark Пожалуйста, пожалуйста, перечислите такие требования в OP ... Однако вы все равно можете найти рецепт OrderedDict; вам не нужно брать его из стандартной библиотеки. –
вы правы, извините - это соскользнуло мне. –