按键值对排序列表字典

17

我正在尝试对一个字典中的列表值进行排序,并创建一个新的列表。以下是数据:

{
    '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(hillary),181(hillary)和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]

这给我最小的价值,但没有其他的,在一次迭代之后,最小的值总是相同的。我想如果我可以删除那个特定的值,那会很有帮助。想不出其他的了。谢谢!

4个回答

17
你可以将字典 (d) 扁平化为一个元组列表,其中包含相应的 键/值 对,并根据值对元组进行排序:
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')

12

你可以:

  1. 反转你的映射, 创建一个数字 => 名字列表的字典
  2. 将这个字典作为元组排序
  3. 选择前三个项目

如下所示:

import collections

d = collections.defaultdict(list)
data = {'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]}

for k,vlist in data.items():
    for v in vlist:
        d[v].append(k)

result = [v[0] for k,v in sorted(d.items())[:3]]

print(result)

这将打印:

['hillary', 'hillary', 'fbi']

请注意,如果一个值有多个名称与之相关联,这段代码将只选择第一个名称(v [0]


希望一个数字只在一个列表中。 - DeepSpace
1
在那种情况下它能够工作,但我想概述另一种情况。 - Jean-François Fabre

3

在sorted()中使用lambda函数。

l = [(k,i) for k,v in d.items() for i in v]
res = [v[0] for v in sorted(l, key=lambda x: x[1])][:20]

0

由于列表中的所有值都已排序,因此您可以使用 heapq.merge

d = {
    '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]
}
import heapq
pairs = [[(k, i) for i in v] for k, v in d.items()]
sorted_pairs = heapq.merge(*pairs, key=lambda a: a[1])
smallest_num_you_want = 3
res = [next(sorted_pairs)[0] for i in range(smallest_num_you_want)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接