python - 按键值对对列表字典进行排序
问题描述
我正在尝试对列表字典中的值进行排序并从中创建一个新列表。这是数据:
{
'fbi': [229, 421, 586, 654, 947, 955, 1095, 1294, 1467, 2423, 3063, 3478, 3617, 3730, 3848, 3959, 4018, 4136, 4297, 4435, 4635, 4679, 4738, 5116, 5211, 5330, 5698, 6107, 6792, 6906, 7036],
'comey': [605, 756, 1388, 1439, 1593, 1810, 1959, 2123, 2506, 3037, 6848],
'hillary': [14, 181, 449, 614, 704, 1079, 1250, 2484, 2534, 2659, 3233, 3374, 3488, 3565, 4076, 4756, 4865, 6125, 7109]
}
我正在尝试的是在其中找到 20 个最小值并获取它们对应的键的列表。例如,前三个最小值是 14(希拉里)、181(希拉里)和 229(fbi)。因此,我怎样才能得到这样的列表:
['hillary', 'hillary', 'fbi']
所有的价值观总是不同的。此外,列表中的所有值都按升序到降序进行排序。
这是我尝试过的:
for m in range(1,20):
for i in sort_vals.values():
if i[0] < a[0]:
a[0] = i[0]
这给了我最小的价值,但没有其他任何价值,因为在一次迭代之后,最小的价值总是相同的。我想如果我可以删除那个特定的值,那会很有帮助。想不出别的了。谢谢!
解决方案
您可以将字典(d
此处)展平为具有相应key/value
对的元组列表,并根据值对元组进行排序:
from operator import itemgetter
l = [(k,i) for k,v in d.items() for i in v]
# [('fbi', 229), ('fbi', 421), ('fbi', 586), ('fbi', 654),...
list(zip(*sorted(l, key=itemgetter(1))[:3]))[0]
# ('hillary', 'hillary', 'fbi')
推荐阅读
- sas - SAS:如何组合文本和日期字段
- reactjs - 如何在 VictoryLegend 组件的 style 道具内圆角?
- php - 具有默认参数值的 php7 函数存在问题
- python-3.x - 写入文件时出现 Apache Spark o27.csv 错误
- html - 需要帮助将页脚的内容居中
- python - 阻塞 Tyk Gateway 中间件导致请求排队
- web-manifest - android“安装应用程序”导致“添加到主屏幕”具有不同的图标
- firebase - Flutter Firestore 快照正在返回数据,但 Firestore 数据库为空
- c# - 列出存储桶目录中的对象
- sql - 简化 PostgreSQL 上的多个关系表