Format list of list sub elements keeping structure.

Sayth Renshaw flebber.crue at gmail.com
Tue Jul 24 06:42:21 EDT 2018


> myjson = ...
> path = "['foo']['bar'][42]"
> print(eval("myjson" + path))
> 
> ?
> 
> Wouldn't it be better to keep 'data' as is and use a helper function like
> 
> def get_value(myjson, path):
>     for key_or_index in path:
>         myjson = myjson[key_or_index]
>     return myjson
> 
> path = ['foo', 'bar', 42]
> print(get_value(myjson, path))
> 
> ?

Currently I do leave the data I extract the keys out as a full path.

If I use pprint as suggested I get close.

   ['glossary'],
    ['glossary', 'title'],
    ['glossary', 'GlossDiv'],
    ['glossary', 'GlossDiv', 'title'],
    ['glossary', 'GlossDiv', 'GlossList'],
    ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry'],
    ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'ID'],
    ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'SortAs'],
    ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossTerm'],
    ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'Acronym'],
...]

But to select elements from the json I need the format json['elem1']['elem2] .

I want to be able to get any json in future and parse it into my function and return a list of all json key elements.

Then using this cool answer on SO https://stackoverflow.com/a/14692747/461887

from functools import reduce  # forward compatibility for Python 3
import operator

def getFromDict(dataDict, mapList):
    return reduce(operator.getitem, mapList, dataDict)

def setInDict(dataDict, mapList, value):
    getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value

Then get the values from the keys
>>> getFromDict(dataDict, ["a", "r"])
1


That would mean I could using my function if I get it write be able to feed it any json, get all the full paths nicely printed and then feed it back to the SO formula and get the values.

It would essentially self process itself and let me get a summary of all keys and their data.

Thanks 

Sayth


More information about the Python-list mailing list