dict
dic = {
1: 'a',
2: 'a',
3: 'b',
4: 'a',
5: 'c',
6: 'd',
7: 'd',
8: 'a',
9: 'a'}
我想删除重复值只保留一个K / V对, 关于这些重复值的“关键”选择,可以是最大值或最小值,也可以通过随机选择其中一个重复值的键。
我不想使用k / v交换,因为它无法控制密钥选择。
取值“a”例如
1: 'a',
2: 'a',
4: 'a',
8: 'a',
9: 'a'
最大键为{9:'a'},最小值为{1:'a'},随机将选择其中任何一个。
并且,如果键是其他类型的哈希值,例如字符串,那么如何进行这样的选择呢?
任何人都可以与我分享想法吗?
谢谢!
答案 0 :(得分:5)
您可以构建一个反向字典,其中的值是初始字典中所有键的列表。使用它你可以做你想要的,最小,最大,随机,交替最小和最大,或其他。
from collections import defaultdict
d = defaultdict(list)
for k,v in dic.iteritems():
d[v].append(k)
print d
# {'a': [1, 2, 4, 8, 9], 'c': [5], 'b': [3], 'd': [6, 7]}
答案 1 :(得分:2)
import itertools as it
newdic = {}
for v, grp in it.groupby(sorted((v, k) for k, v in dic.items)):
newdic[min(k for _, k in grp)] = v
或其他“选择”函数代替min
(当然,即使键是字符串也可以正常工作 - 在这种情况下会给你“词法优先”键。)
选择函数需要注意的一种情况是,对应于相同值的键可能是不可比较的(例如,复数,或者,在Python 3中,不同的非全数字类型的对象) 。 key=
中的min
无法治愈; - )。
答案 2 :(得分:1)
这将为您提供随机选择的唯一键:
In [29]: dic
Out[29]: {1: 'a', 2: 'a', 3: 'b', 4: 'a', 5: 'c', 6: 'd', 7: 'd', 8: 'a', 9: 'a'}
In [30]: dict((v,k) for k,v in dic.iteritems())
Out[30]: {'a': 9, 'b': 3, 'c': 5, 'd': 7}
In [31]: dict((v,k) for k,v in dict((v,k) for k,v in dic.iteritems()).iteritems())
Out[31]: {3: 'b', 5: 'c', 7: 'd', 9: 'a'}