[英]Python dict addition
我有這樣的兩個詞,
past =
{
'500188':
{
2: {'S': 16.97011741552128, 'C': 16.97011741552128},
3: {'S': -41.264072314989576, 'C': 'ERROR: reported_eps value not found for the year 2012.'},
4: {'S': -40.45410186823402, 'C': 'ERROR: reported_eps value not found for the year 2012.'}
},
'524715':
{
2: {'S': 46.21665549733925, 'C': 38.67504905630727},
3: {'S': -32.729615295373385, 'C': -34.21172523465267},
4: {'S': -22.25028773515787, 'C': -36.041635048402}
},
'513683':
{
2: {'S': 6.319158390481139, 'C': 6.319158390481139},
3: {'S': 19.81072942574542, 'C': 19.81072942574542},
4: {'S': 6.367182731764687, 'C': 'ERROR: reported_eps value not found for the year 2008.'}
}
}
future =
{
'500188':
{
2: {'S': 16.97011741552128, 'C': 16.97011741552128},
3: {'S': -41.264072314989576, 'C': 'ERROR: reported_eps value not found for the year 2012.'},
4: {'S': -40.45410186823402, 'C': 'ERROR: reported_eps value not found for the year 2012.'}
},
'524715':
{
2: {'S': 46.21665549733925, 'C': 38.67504905630727},
3: {'S': -32.729615295373385, 'C': -34.21172523465267},
4: {'S': -22.25028773515787, 'C': -36.041635048402}
}
}
添加它們我已經這樣做了,
def _float(value):
try:
return float(value)
except ValueError:
return 0
print {key:
{
year: {
_type:
(_float(past.get(key, {}).get(year, {}).get(_type, 0)) + _float(future.get(key, {}).get(year, {}).get(_type, 0)))/2 for _type in ['S', 'C']
}for year in [4,3,2] #Second Loop
}for key in set(past.keys()+future.keys()) #First Loop
}
獲得了理想的輸出,
{
'500188':
{
2: {'S': 16.97011741552128, 'C': 16.97011741552128},
3: {'S': -41.264072314989576, 'C': 0},
4: {'S': -40.45410186823402, 'C': 0}
},
'513683':
{
2: {'S': 3.1595791952405694, 'C': 3.1595791952405694},
3: {'S': 9.90536471287271, 'C': 9.90536471287271},
4: {'S': 3.1835913658823434, 'C': 0.0}
},
'524715':
{
2: {'S': 46.21665549733925, 'C': 38.67504905630727},
3: {'S': -32.729615295373385, 'C': -34.21172523465267},
4: {'S': -22.25028773515787, 'C': -36.041635048402}
}
}
但是,應該有一些比這更好的解決方案,我用Google搜索並發現了類似的問題,
python dict.add_by_value(dict_2)?
但是值是頂級的,但在我的情況下,該值不在頂級,我必須進行類型檢查並且必須計算平均值。 什么是解決這個問題的最佳方法。
(Python版本2.7)
使用分層數據作為嵌套的dicts總是會很痛苦; 你最好使用像熊貓這樣的圖書館:
import pandas as pd, numpy as np
pp = pd.Panel(past).to_frame()
pf = pd.Panel(future).to_frame()
pp.replace('.', 0, regex=True) + pf.replace('.', 0, regex=True) / 2
500188 513683 524715
major minor
C 2 25.455176 NaN 58.012574
3 0.000000 NaN -51.317588
4 0.000000 NaN -54.062453
S 2 25.455176 NaN 69.324983
3 -61.896108 NaN -49.094423
4 -60.681153 NaN -33.375432
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.