【问题标题】:Flatten dictionary with repeated values使用重复值展平字典
【发布时间】:2018-03-16 02:53:32
【问题描述】:

寻找没有循环的最有效方法... 鉴于以下 Python(2.7) 字典:

l = [{
"General": {
    "Iteration": {
        "CATID": 74470
    }
},
"Return": {
    "Effectiveness": {
        "Metrics": [{
            "Volume": 1004287.8947531971,
            "BusinessMetricID": 1,
            "ImpactScore": 0.032579772546071015,
            "GrossMargin": 10042878.94753197,
            "Revenue": 20085757.89506394
        },
        {
            "Volume": 2678101.0526751927,
            "BusinessMetricID": 2,
            "ImpactScore": 0.08687939345618939,
            "GrossMargin": 6695252.631687982,
            "Revenue": 13390505.263375964
        }]
    }
}
},
{
"General": {
    "Iteration": {
        "CATID": 74471
    }
},
"Return": {
    "Effectiveness": {
        "Metrics": [{
            "Volume": 1004287.8947531971,
            "BusinessMetricID": 1,
            "ImpactScore": 0.032579772546071015,
            "GrossMargin": 10042878.94753197,
            "Revenue": 20085757.89506394
        },
        {
            "Volume": 2678101.0526751927,
            "BusinessMetricID": 2,
            "ImpactScore": 0.08687939345618939,
            "GrossMargin": 6695252.631687982,
            "Revenue": 13390505.263375964
        }]
    }
}
}]

我试图在添加 CATID 属性以获取以下字典列表的同时展平列表的指标列表

[{
"CATID": 74470,    
"Volume": 35399.19921217802,
"BusinessMetricID": 1,
"ImpactScore": 0.015,
"GrossMargin": 353991.9921217802,
"Revenue": 707983.9842435603
},
{
"CATID": 74470,
"Volume": 94397.86456580806,
"BusinessMetricID": 2,
"ImpactScore": 0.04,
"GrossMargin": 235994.66141452017,
"Revenue": 471989.32282904035
},
{
"CATID": 74471,    
"Volume": 35399.19921217802,
"BusinessMetricID": 1,
"ImpactScore": 0.015,
"GrossMargin": 353991.9921217802,
"Revenue": 707983.9842435603
},
{
"CATID": 74471,
"Volume": 94397.86456580806,
"BusinessMetricID": 2,
"ImpactScore": 0.04,
"GrossMargin": 235994.66141452017,
"Revenue": 471989.32282904035
}
]

最有效的方法是什么?我尝试使用列表理解,但找不到添加额外属性的方法。 简单地展平我使用的指标:

[item for sublist in [x['Return']['Effectiveness']['Metrics'] for x in l] for item in sublist]

这给了我:

[{
'Volume': 1004287.8947531971,
'BusinessMetricID': 1,
'ImpactScore': 0.032579772546071015,
'GrossMargin': 10042878.94753197,
'Revenue': 20085757.89506394
 },
{
'Volume': 2678101.0526751927,
'BusinessMetricID': 2,
'ImpactScore': 0.08687939345618939,
'GrossMargin': 6695252.631687982,
'Revenue': 13390505.263375964
 },
 {
'Volume': 1004287.8947531971,
'BusinessMetricID': 1,
'ImpactScore': 0.032579772546071015,
'GrossMargin': 10042878.94753197,
'Revenue': 20085757.89506394
 },
 {
'Volume': 2678101.0526751927,
'BusinessMetricID': 2,
'ImpactScore': 0.08687939345618939,
'GrossMargin': 6695252.631687982,
'Revenue': 13390505.263375964
 }]

谢谢。

【问题讨论】:

    标签: python list dictionary list-comprehension flatten


    【解决方案1】:

    我认为专家可以提供更好的解决方案。 这是我的解决方案。你可以留意 itertools 模块。

    from itertools import product, chain
    nl = chain.from_iterable([ product( i['General']['Iteration'].items(), [ j.items() for j in i['Return']['Effectiveness']['Metrics'] ]) for i in l ])
    [ dict([i] + list(j)) for i,j in nl ]
    

    输出:

    [{'BusinessMetricID': 1,
      'CATID': 74470,
      'GrossMargin': 10042878.94753197,
      'ImpactScore': 0.032579772546071015,
      'Revenue': 20085757.89506394,
      'Volume': 1004287.8947531971},
     {'BusinessMetricID': 2,
      'CATID': 74470,
      'GrossMargin': 6695252.631687982,
      'ImpactScore': 0.08687939345618939,
      'Revenue': 13390505.263375964,
      'Volume': 2678101.0526751927},
     {'BusinessMetricID': 1,
      'CATID': 74471,
      'GrossMargin': 10042878.94753197,
      'ImpactScore': 0.032579772546071015,
      'Revenue': 20085757.89506394,
      'Volume': 1004287.8947531971},
     {'BusinessMetricID': 2,
      'CATID': 74471,
      'GrossMargin': 6695252.631687982,
      'ImpactScore': 0.08687939345618939,
      'Revenue': 13390505.263375964,
      'Volume': 2678101.0526751927}]
    

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 2021-12-31
      • 2021-06-02
      • 1970-01-01
      • 2021-01-22
      • 2021-06-02
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多