python dict按键的值删除重复值?

时间:2010-08-04 03:19:47

标签: python dictionary duplicates

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'},随机将选择其中任何一个。

并且,如果键是其他类型的哈希值,例如字符串,那么如何进行这样的选择呢?

任何人都可以与我分享想法吗?

谢谢!

3 个答案:

答案 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'}