试着把字典里的一个单子整理成键值

2024-05-15 22:00:34 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试从Json中展平别名键

{
    "name": "Rocky Marci",
    "aliases": ["Rocky", "Champ"],
    "physical": {
        "height_in": 67,
        "weight_lb": 150
    },
    "Fights": 49
}

就像下面这样

{
    "name": "Rocky Marci",
    "aliases.0": "Rocky",
    "aliases.1": "Champ",
    "physical.height_in": 67,
    "physical.weight_lb": 150,
    "Fights": 49
}

我试过了

def flatten(d, parent_key='', sep='_'):
    items = []
    for k, v in d.items():
        new_key = parent_key + sep + k if parent_key else k
        if isinstance(v, collections.MutableMapping):
            items.extend(flatten(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

但这并不能使阵列变平


Tags: keynameinnewitemssepparentheight
2条回答

因为list不是collections.MutableMapping的实例。我建议查查

isinstance(v, (list, dict))

相反。你知道吗

更多的可能性是here

可以使用递归:

s = {
 "name": "Rocky Marci",
 "aliases": ["Rocky", "Champ"],
 "physical": {
    "height_in": 67,
    "weight_lb": 150
  },
  "Fights": 49
}
def flatten(d, last = ''):
   for a, b in d.items():
     if type(b) in [int, str]:
       yield ("{}.{}".format(a, last) if last else a, b)
     if isinstance(b, list):
       for i, c in enumerate(b):
         yield ("{}.{}".format(a, i), c)
     if isinstance(b, dict):
        for i in flatten(b, last = a):
           yield i

result = dict(list(flatten(s)))

输出:

{'aliases.0': 'Rocky', 'height_in.physical': 67, 'name': 'Rocky Marci', 'aliases.1': 'Champ', 'Fights': 49, 'weight_lb.physical': 150}

相关问题 更多 >