我有一个键字典,每个键都有嵌套的键/标签值。如果这是一个糟糕的解释,请看下面的例子。
{
'ATVI':
{'momentum': 1695172800449.7812, 'sma': 81.97039999999998},
'ADBE':
{'momentum': 15.37463410207528, 'sma': 484.3043000000006},
'AMD':
{'momentum': 7.319987019427009e+20, 'sma': 85.5414}
}
我需要生成具有最高动量的20个键的列表。在不影响字典中的信息的情况下,怎样做是最好的呢?
另一种方法是存储按动量排序的顶级键列表。
data = {'ATVI': {'momentum': 1695172800449.7812, 'sma': 81.97039999999998}, 'ADBE': {'momentum': 15.37463410207528, 'sma': 484.3043000000006}, 'AMD': {'momentum': 7.319987019427009e+20, 'sma': 85.5414}}
sdata = list(data.keys())
sdata.sort(key=lambda x: data[x]["momentum"])
从这里开始,您必须在遍历列表时访问字典。如果你想让列表递减,你可以在key
reverse=True
编辑:要获得前20名,您可以通过sdata[-20:]
切片列表,或者如果您使用反向sdata[:20]
。如上所述,可能存在第20和21个元素具有相同值的问题。
您可以将动量放入单独的字典中:
momentums = {k: v['momentum'] for k, v in d.items()}
然后获取前20个最高值的键:
[k for k, v in momentums.items() if v in sorted(momentums.values())[-20:]]
(可能存在边缘情况,第20和21个最高动量完全相同,在这种情况下,它将任意选择一个键;所以这取决于你是否需要更复杂的东西,你需要多小心。