如何通过将列表的索引视为键来使包含列表的字典扁平化? [英] How can I flatten dict containing list by considering its index as key?

查看:64
本文介绍了如何通过将列表的索引视为键来使包含列表的字典扁平化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想把字典弄平.词典中可能包含列表.因此,在扁平化字典中的列表时,应将列表索引作为其键.

I want to flatten the dict. Dictionary may contain lists. So while flattening lists inside dictionary, it should consider list index as its key.

我该怎么做?

我尝试过:

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)

这是平整的字典,但忽略了列表.

This is flattening dict but ignoring lists.

我还尝试添加 if isinstance(v,list):,但是我没有在项目.

I also tried to add if isinstance(v, list):, but I am not getting how to append / extend in items.

data = {
    "checksum": "c540fcd985bf88c87e48c2bfa1df5498",
    "data": {
        "sampleMetrics": {
            "name": "DNA Library QC Metrics",
            "passQualityControl": "true",
            "metrics": [{
                "name": "CONTAMINATION_SCORE",
                "value": 1302,
                "LSL": 0,
                "USL": 3106,
                "UOM": "NA"
            }]
        }
    }
}
print flatten(data)

我得到的输出:

{
    'checksum': 'c540fcd985bf88c87e48c2bfa1df5498',
    'data__sampleMetrics__metrics': [{
        'LSL': 0,
        'USL': 3106,
        'name': 'CONTAMINATION_SCORE',
        'value': 1302,
        'UOM': 'NA'
    },{ 'demo': 11}],
    'data__sampleMetrics__name': 'DNA Library QC Metrics',
    'data__sampleMetrics__passQualityControl': 'true'
}

除了列表元素之外,还有什么其他扁平化的内容.

Which is flattening other thing except list elements.

预期输出:它也应该使列表变平.(通过将列表索引作为键.)

Expected output : It should flatten list as well.(By considering list index as key.)

{
    'checksum': 'c540fcd985bf88c87e48c2bfa1df5498',
    'data__sampleMetrics__metrics__0__LSL': 0,
    'data__sampleMetrics__metrics__0__USL': 3106,
    'data__sampleMetrics__metrics__0__name': 'CONTAMINATION_SCORE',
    'data__sampleMetrics__metrics__0__value': 1302,
    'data__sampleMetrics__metrics__0__UOM': 'NA',
    'data__sampleMetrics__metrics__1__demo': 11,
    'data__sampleMetrics__name': 'DNA Library QC Metrics',
    'data__sampleMetrics__passQualityControl': 'true'
}

如何通过将其索引视为键来拼合包含列表的字典?

推荐答案

您还需要检查列表-它们不是

You need to check for lists as well - they are not MutableMapings - hence they currently fall under your else: part and get added as is:

import collections
from itertools import chain 

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())
        elif isinstance(v, list):
            for idx, value in enumerate(v):
                items.extend(flatten(value, new_key + sep + str(idx), sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

data = {
    "checksum": "c540fcd985bf88c87e48c2bfa1df5498",
    "data": {
        "sampleMetrics": {
            "name": "DNA Library QC Metrics",
            "passQualityControl": "true",
            "metrics": [{
                "name": "CONTAMINATION_SCORE",
                "value": 1302,
                "LSL": 0,
                "USL": 3106,
                "UOM": "NA"
            },{ 'demo': 11}]
        }
    }
}

print flatten(data) 

输出:

{'data__sampleMetrics__metrics__0__LSL': 0, 
 'checksum': 'c540fcd985bf88c87e48c2bfa1df5498', 
 'data__sampleMetrics__metrics__0__name': 'CONTAMINATION_SCORE', 
 'data__sampleMetrics__metrics__1__demo': 11, 
 'data__sampleMetrics__metrics__0__UOM': 'NA', 
 'data__sampleMetrics__metrics__0__USL': 3106, 
 'data__sampleMetrics__metrics__0__value': 1302, 
 'data__sampleMetrics__passQualityControl': 'true', 
 'data__sampleMetrics__name': 'DNA Library QC Metrics'}


要获取排序的"输出,您需要在python 2.x中使用OrderedDict:


To get a "sorted" output you would need to use an OrderedDict in python 2.x:

从集合中导入OrderedDict

from collections import OrderedDict

data = OrderedDict(sorted(flatten(data).items()))
print data 

输出:

OrderedDict([('checksum', 'c540fcd985bf88c87e48c2bfa1df5498'), 
             ('data__sampleMetrics__metrics__0__LSL', 0), 
             ('data__sampleMetrics__metrics__0__UOM', 'NA'), 
             ('data__sampleMetrics__metrics__0__USL', 3106), 
             ('data__sampleMetrics__metrics__0__name', 'CONTAMINATION_SCORE'), 
             ('data__sampleMetrics__metrics__0__value', 1302), 
             ('data__sampleMetrics__metrics__1__demo', 11), 
             ('data__sampleMetrics__name', 'DNA Library QC Metrics'), 
             ('data__sampleMetrics__passQualityControl', 'true')])

这篇关于如何通过将列表的索引视为键来使包含列表的字典扁平化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆