Format list of list sub elements keeping structure.

Peter Otten __peter__ at web.de
Tue Jul 24 07:40:04 EDT 2018


Sayth Renshaw wrote:

> 
>> 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)

Note that my -- not so cool ;) -- function

>> def get_value(myjson, path):

does the same in a way that I expected to be easier to understand than the 
functional idiom.
 
> 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.

OK, if this is really just about printing

>>> path = ["foo", "bar", 42]
>>> print("".join("[{!r}]".format(key) for key in path))
['foo']['bar'][42]


> 
> 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