使用 heapq 从复杂的嵌套字典中排序和 select
Sort and select from a complex nested dictionary using heapq
我有以下嵌套字典:
a={'2020-12-08':
{'navi.o_efx': {'coint_value': 0.923033, 'hl_value': 0.475025},
'stm.n_efx': {'coint_value': 0.915424, 'hl_value': 0.294162},
'kioo.o_efx': {'coint_value': 0.92575, 'hl_value': 0.369817}},
'2020-09-24':
{'navi.o_qrvo.o': {'coint_value': 0.919749, 'hl_value': 0.215322},
'qrvo.o_efx': {'coint_value': 0.976447, 'hl_value': 0.11208},
'navi.o_stm.n': {'coint_value': 0.974414, 'hl_value': 0.168408},
'qrvo.o_stm.n': {'coint_value': 0.964797, 'hl_value': 0.14407},
'stm.n_efx': {'coint_value': 0.935519, 'hl_value': 0.166952}},
'2020-11-01':
{'qrvo.o_stm.n': {'coint_value': 0.95096, 'hl_value': 0.104152}}
}
我想用heapq在'hl_value'的基础上进行排序,并为特定日期选择了最小的2个子词典。例如,最终输出应如下所示:
a={'2020-12-08':
{'stm.n_efx': {'coint_value': 0.915424, 'hl_value': 0.294162},
'kioo.o_efx': {'coint_value': 0.92575, 'hl_value': 0.369817}},
'2020-09-24':
{'qrvo.o_efx': {'coint_value': 0.976447, 'hl_value': 0.11208},
'qrvo.o_stm.n': {'coint_value': 0.964797, 'hl_value': 0.14407}},
'2020-11-01':
{'qrvo.o_stm.n': {'coint_value': 0.95096, 'hl_value': 0.104152}}
}
我尝试使用以下代码,但似乎不起作用:
for k, v in a.items():
for i_k, i_v in v.items():
a[k][i_k] = dict(heapq.nsmallest(2, i_v.items(), key=i_v['hl_value']))
此处使用heapq.nsmallest:
import heapq
a = {
'2020-12-08':
{
'navi.o_efx': {'coint_value': 0.923033, 'hl_value': 0.475025},
'stm.n_efx': {'coint_value': 0.915424, 'hl_value': 0.294162},
'kioo.o_efx': {'coint_value': 0.92575, 'hl_value': 0.369817}
},
'2020-09-24':
{
'navi.o_qrvo.o': {'coint_value': 0.919749, 'hl_value': 0.215322},
'qrvo.o_efx': {'coint_value': 0.976447, 'hl_value': 0.11208},
'navi.o_stm.n': {'coint_value': 0.974414, 'hl_value': 0.168408},
'qrvo.o_stm.n': {'coint_value': 0.964797, 'hl_value': 0.14407},
'stm.n_efx': {'coint_value': 0.935519, 'hl_value': 0.166952}
},
'2020-11-01':
{
'qrvo.o_stm.n': {'coint_value': 0.95096, 'hl_value': 0.104152}
}
}
for key in a:
result = heapq.nsmallest(2, a[key].items(), key=lambda value: value[1]['hl_value'])
a[key] = dict(result)
print(a)
输出
{'2020-12-08': {'stm.n_efx': {'coint_value': 0.915424, 'hl_value': 0.294162}, 'kioo.o_efx': {'coint_value': 0.92575, 'hl_value': 0.369817}}, '2020-09-24': {'qrvo.o_efx': {'coint_value': 0.976447, 'hl_value': 0.11208}, 'qrvo.o_stm.n': {'coint_value': 0.964797, 'hl_value': 0.14407}}, '2020-11-01': {'qrvo.o_stm.n': {'coint_value': 0.95096, 'hl_value': 0.104152}}}
输出(通过print(json.dumps(a, indent=4))
打印得很好):
{
"2020-12-08": {
"stm.n_efx": {
"coint_value": 0.915424,
"hl_value": 0.294162
},
"kioo.o_efx": {
"coint_value": 0.92575,
"hl_value": 0.369817
}
},
"2020-09-24": {
"qrvo.o_efx": {
"coint_value": 0.976447,
"hl_value": 0.11208
},
"qrvo.o_stm.n": {
"coint_value": 0.964797,
"hl_value": 0.14407
}
},
"2020-11-01": {
"qrvo.o_stm.n": {
"coint_value": 0.95096,
"hl_value": 0.104152
}
}
}
我有以下嵌套字典:
a={'2020-12-08':
{'navi.o_efx': {'coint_value': 0.923033, 'hl_value': 0.475025},
'stm.n_efx': {'coint_value': 0.915424, 'hl_value': 0.294162},
'kioo.o_efx': {'coint_value': 0.92575, 'hl_value': 0.369817}},
'2020-09-24':
{'navi.o_qrvo.o': {'coint_value': 0.919749, 'hl_value': 0.215322},
'qrvo.o_efx': {'coint_value': 0.976447, 'hl_value': 0.11208},
'navi.o_stm.n': {'coint_value': 0.974414, 'hl_value': 0.168408},
'qrvo.o_stm.n': {'coint_value': 0.964797, 'hl_value': 0.14407},
'stm.n_efx': {'coint_value': 0.935519, 'hl_value': 0.166952}},
'2020-11-01':
{'qrvo.o_stm.n': {'coint_value': 0.95096, 'hl_value': 0.104152}}
}
我想用heapq在'hl_value'的基础上进行排序,并为特定日期选择了最小的2个子词典。例如,最终输出应如下所示:
a={'2020-12-08':
{'stm.n_efx': {'coint_value': 0.915424, 'hl_value': 0.294162},
'kioo.o_efx': {'coint_value': 0.92575, 'hl_value': 0.369817}},
'2020-09-24':
{'qrvo.o_efx': {'coint_value': 0.976447, 'hl_value': 0.11208},
'qrvo.o_stm.n': {'coint_value': 0.964797, 'hl_value': 0.14407}},
'2020-11-01':
{'qrvo.o_stm.n': {'coint_value': 0.95096, 'hl_value': 0.104152}}
}
我尝试使用以下代码,但似乎不起作用:
for k, v in a.items():
for i_k, i_v in v.items():
a[k][i_k] = dict(heapq.nsmallest(2, i_v.items(), key=i_v['hl_value']))
此处使用heapq.nsmallest:
import heapq
a = {
'2020-12-08':
{
'navi.o_efx': {'coint_value': 0.923033, 'hl_value': 0.475025},
'stm.n_efx': {'coint_value': 0.915424, 'hl_value': 0.294162},
'kioo.o_efx': {'coint_value': 0.92575, 'hl_value': 0.369817}
},
'2020-09-24':
{
'navi.o_qrvo.o': {'coint_value': 0.919749, 'hl_value': 0.215322},
'qrvo.o_efx': {'coint_value': 0.976447, 'hl_value': 0.11208},
'navi.o_stm.n': {'coint_value': 0.974414, 'hl_value': 0.168408},
'qrvo.o_stm.n': {'coint_value': 0.964797, 'hl_value': 0.14407},
'stm.n_efx': {'coint_value': 0.935519, 'hl_value': 0.166952}
},
'2020-11-01':
{
'qrvo.o_stm.n': {'coint_value': 0.95096, 'hl_value': 0.104152}
}
}
for key in a:
result = heapq.nsmallest(2, a[key].items(), key=lambda value: value[1]['hl_value'])
a[key] = dict(result)
print(a)
输出
{'2020-12-08': {'stm.n_efx': {'coint_value': 0.915424, 'hl_value': 0.294162}, 'kioo.o_efx': {'coint_value': 0.92575, 'hl_value': 0.369817}}, '2020-09-24': {'qrvo.o_efx': {'coint_value': 0.976447, 'hl_value': 0.11208}, 'qrvo.o_stm.n': {'coint_value': 0.964797, 'hl_value': 0.14407}}, '2020-11-01': {'qrvo.o_stm.n': {'coint_value': 0.95096, 'hl_value': 0.104152}}}
输出(通过print(json.dumps(a, indent=4))
打印得很好):
{
"2020-12-08": {
"stm.n_efx": {
"coint_value": 0.915424,
"hl_value": 0.294162
},
"kioo.o_efx": {
"coint_value": 0.92575,
"hl_value": 0.369817
}
},
"2020-09-24": {
"qrvo.o_efx": {
"coint_value": 0.976447,
"hl_value": 0.11208
},
"qrvo.o_stm.n": {
"coint_value": 0.964797,
"hl_value": 0.14407
}
},
"2020-11-01": {
"qrvo.o_stm.n": {
"coint_value": 0.95096,
"hl_value": 0.104152
}
}
}