2017-10-04 67 views
1

尋找最有效的方式,而不循環...... 鑑於以下的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 
}] 

謝謝。

回答

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