def nest_list(L):
idx = {}
children = []
root = []
# first pass: index items by id
# if the item has no parents, put it in the 'root' list
# otherwise add it to the 'children' list which we will
# process in a second pass
for item in L:
idx[item['id']] = item
if 'parent' in item:
children.append(item)
else:
root.append(item)
# second pass: find the parents of our children
for child in children:
parent = idx[child['parent']]
del child['parent']
try:
# retrieve the list of children for this
# parent
childlist = parent['children']
except KeyError:
# this item has received no children so far
# so we need to make a 'children' key and list
# for it.
parent['children'] = childlist = []
# append this child to the parent's list of children
childlist.append(child)
#all done: return new root list
return root
oldlist = [{
"name":"Folder 2",
"id":"zRDg",
"parent":"OY00",
"type":"folder"
},
{
"name":"Folder 1",
"id":"OY00",
"type":"folder"
},
{
"name":"Folder 2",
"id":"ZDE1",
"type":"folder"
},
{
"name":"Folder 4",
"id":"aaaa",
"parent":"zRDg",
"type":"folder"
},
{
"name":"DX00025.jpg",
"id":"9Xdd",
"parent":"OY00",
"type":"jpeg"
}]
from pprint import pprint
newlist = nest_list(oldlist)
from operator import itemgetter
sar = sorted(newlist,key=itemgetter('type'))
pprint(newlist)
ZGVmIG5lc3RfbGlzdChMKToKICAgIGlkeCA9IHt9CiAgICBjaGlsZHJlbiA9IFtdCiAgICByb290ID0gW10KICAgICMgZmlyc3QgcGFzczogaW5kZXggaXRlbXMgYnkgaWQKICAgICMgaWYgdGhlIGl0ZW0gaGFzIG5vIHBhcmVudHMsIHB1dCBpdCBpbiB0aGUgJ3Jvb3QnIGxpc3QKICAgICMgb3RoZXJ3aXNlIGFkZCBpdCB0byB0aGUgJ2NoaWxkcmVuJyBsaXN0IHdoaWNoIHdlIHdpbGwKICAgICMgcHJvY2VzcyBpbiBhIHNlY29uZCBwYXNzCiAgICBmb3IgaXRlbSBpbiBMOgogICAgICAgIGlkeFtpdGVtWydpZCddXSA9IGl0ZW0KICAgICAgICBpZiAncGFyZW50JyBpbiBpdGVtOgogICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQoaXRlbSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByb290LmFwcGVuZChpdGVtKQogCiAgICAjIHNlY29uZCBwYXNzOiBmaW5kIHRoZSBwYXJlbnRzIG9mIG91ciBjaGlsZHJlbgogICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgogICAgICAgIHBhcmVudCA9IGlkeFtjaGlsZFsncGFyZW50J11dCiAgICAgICAgZGVsIGNoaWxkWydwYXJlbnQnXQogICAgICAgIHRyeToKICAgICAgICAgICAgIyByZXRyaWV2ZSB0aGUgbGlzdCBvZiBjaGlsZHJlbiBmb3IgdGhpcwogICAgICAgICAgICAjIHBhcmVudAogICAgICAgICAgICBjaGlsZGxpc3QgPSBwYXJlbnRbJ2NoaWxkcmVuJ10KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICMgdGhpcyBpdGVtIGhhcyByZWNlaXZlZCBubyBjaGlsZHJlbiBzbyBmYXIKICAgICAgICAgICAgIyBzbyB3ZSBuZWVkIHRvIG1ha2UgYSAnY2hpbGRyZW4nIGtleSBhbmQgbGlzdAogICAgICAgICAgICAjIGZvciBpdC4KICAgICAgICAgICAgcGFyZW50WydjaGlsZHJlbiddID0gY2hpbGRsaXN0ID0gW10KICAgICAgICAjIGFwcGVuZCB0aGlzIGNoaWxkIHRvIHRoZSBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuCiAgICAgICAgY2hpbGRsaXN0LmFwcGVuZChjaGlsZCkKIAogICAgI2FsbCBkb25lOiByZXR1cm4gbmV3IHJvb3QgbGlzdAogICAgcmV0dXJuIHJvb3QKICAgIApvbGRsaXN0ID0gW3sKICAibmFtZSI6IkZvbGRlciAyIiwKICAiaWQiOiJ6UkRnIiwKICAicGFyZW50IjoiT1kwMCIsCiAgInR5cGUiOiJmb2xkZXIiCn0sCnsKICAibmFtZSI6IkZvbGRlciAxIiwKICAiaWQiOiJPWTAwIiwKICAidHlwZSI6ImZvbGRlciIKfSwKewogICJuYW1lIjoiRm9sZGVyIDIiLAogICJpZCI6IlpERTEiLAogICJ0eXBlIjoiZm9sZGVyIgp9LAp7CiAgIm5hbWUiOiJGb2xkZXIgNCIsCiAgImlkIjoiYWFhYSIsCiAgInBhcmVudCI6InpSRGciLCAgIAogICJ0eXBlIjoiZm9sZGVyIgp9LAp7CiAgIm5hbWUiOiJEWDAwMDI1LmpwZyIsCiAgImlkIjoiOVhkZCIsCiAgInBhcmVudCI6Ik9ZMDAiLAogICJ0eXBlIjoianBlZyIKfV0KIApmcm9tIHBwcmludCBpbXBvcnQgcHByaW50Cm5ld2xpc3QgPSBuZXN0X2xpc3Qob2xkbGlzdCkKZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgpzYXIgPSBzb3J0ZWQobmV3bGlzdCxrZXk9aXRlbWdldHRlcigndHlwZScpKQpwcHJpbnQobmV3bGlzdCk=
[{'children': [{'children': [{'id': 'aaaa',
'name': 'Folder 4',
'type': 'folder'}],
'id': 'zRDg',
'name': 'Folder 2',
'type': 'folder'},
{'id': '9Xdd', 'name': 'DX00025.jpg', 'type': 'jpeg'}],
'id': 'OY00',
'name': 'Folder 1',
'type': 'folder'},
{'id': 'ZDE1', 'name': 'Folder 2', 'type': 'folder'}]