Created
August 24, 2016 22:28
-
-
Save cascad-s/c39db32700bd170f8745180cac10cfcd to your computer and use it in GitHub Desktop.
very useful when working with information from erlang
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def is_pair(item): | |
if isinstance(item, list): | |
if len(item) == 2: | |
if isinstance(item[0], str): # and isinstance(item[1], list) | |
return True | |
return False | |
def is_pairs_list(item): | |
if isinstance(item, list): | |
if len(item) > 0: | |
return all(map(is_pair, item)) | |
return False | |
def nested_dict2pairs(dicts): | |
pairs = [] | |
for k, v in dicts.items(): | |
if isinstance(v, dict): | |
pairs.append([k, nested_dict2pairs(v)]) | |
else: | |
pairs.append([k, v]) | |
return pairs | |
def nested_pairs2dict(pairs): | |
d = {} | |
if is_pairs_list(pairs): | |
for k, v in pairs: | |
d[k] = nested_pairs2dict(v) | |
return d | |
elif is_pair(pairs): | |
k, v = pairs | |
d[k] = nested_pairs2dict(v) | |
return d | |
elif isinstance(pairs, dict): | |
for k, v in pairs.items(): | |
d[k] = nested_pairs2dict(v) | |
return d | |
else: | |
return pairs | |
if __name__ == "__main__": | |
from pprint import pprint | |
ex = ["rating", [["key_1", ["key_11", [["key_111", "val_111"], ["key_112", "val_112"], ["key_113", "val_113"]]]], | |
["key_2", "value_2"], ["key_3", "value_3"]]] | |
ex2 = {"rating": {"key2": {"key3": [1, 2, 3], "key4": "123"}, "key2_2": {"key3_1": [4, 5], "key3_2": []}}} | |
# pprint(nested_pairs2dict(ex)) | |
# pprint(nested_dict2pairs(ex2)) | |
print(nested_pairs2dict(nested_dict2pairs(nested_pairs2dict(ex))) == nested_pairs2dict(ex)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment