在 Python 字典中保留非重复值的最小键

Keep smallest keys for distinct values in Python dictionary

提问人:Hack-R 提问时间:11/8/2017 最后编辑:Hack-R 更新时间:11/9/2017 访问量:215

问:

我有一个字典,其中包含不同的整数键和可能重复的值,如下所示:

my_data = {5:1,2:2,3:2,4:2,1:1}

我知道如何使用不同值来获取不同值,但我想做的是选择具有不同值及其键对,其中重复值中出现的小键,如下所示:set()

{1:1, 2:2} 
Python 字典

评论

0赞 smac89 11/8/2017
Python 不保证字典中项目的顺序。你也调用你的变量,但它指的是字典my_list
0赞 Hack-R 11/8/2017
@smac89 这很好,不能保证顺序,如果需要,我可以事后排序(但不是这个问题的必备条件)。如果您愿意,我可以更改变量名称;)

答:

2赞 tobias_k 11/8/2017 #1

首先,对第二个字典中具有相同值的键进行分组。然后,使用字典推导式来获取具有重复键的所有值的最小键。

>>> import collections
>>> my_data = {5:1,2:2,3:2,4:2,1:1}
>>> d = collections.defaultdict(list)
>>> for k, v in my_data.items():
...    d[v].append(k)
>>> {min(keys): value for value, keys in d.items() if len(keys) > 1}
{1: 1, 2: 2}

(不确定 .如果这不是“在重复值中”的意思,那么只需删除该部分即可。if len(key) > 1

2赞 Moses Koledoye 11/8/2017 #2

按值对字典键值对进行排序,然后按键(较低的键在前),按值它们进行分组,然后取每个组中的第一个键,这将是该值的最低键。

您可以在没有中间字典的情况下在字典理解中完成:

from itertools import groupby

dct = {5:1, 2:2, 3:2, 4:2, 1:1}
new_dict = dict(next(g) for _, g in groupby(sorted(dct.items(),
                          key=lambda x: x[::-1]), lambda x: x[1]))
# {1: 1, 2: 2}

评论

0赞 tobias_k 11/8/2017
dict(next(g) for _, g in ... )