d = {"a": [10, 15], "b": [10, 20], "c": [10, 15]}
values = []
for k, v in d.iteritems():
must_insert = True
for val in values:
if val[0] == v:
val[1].append(k)
must_insert = False
break
if must_insert: values.append([v, [k]])
print [v for v in values if len(v[1]) > 1] #prints [[[10, 15], ['a', 'c']]]
from collections import defaultdict
d = {'w':20, 'x':10, 'y':20, 'z':30, 'a':10}
dd = defaultdict(set)
for k, v in d.items():
dd[v].add(k)
dd = { k : v for k, v in dd.items() if len(v) > 1 }
dd
=> {10: set(['a', 'x']), 20: set(['y', 'w'])}
要检测所有这些病例:
@hivert提出了一个很好的观点,即只有当值是可散列的时,这才有效。如果不是这样,就没有好的O(n)解决方案(遗憾的是)。这是我能想到的最好办法:
这是在假设下的,你唯一想知道的是是否有任何重复的值,而不是哪些值是重复的,这是我从你的问题中假设的。如果我误解了这个问题,请告诉我
基本上,这只是检查当字典的值被强制转换到一个根据定义没有任何重复项的对象时,是否有任何条目被删除
如果上述方法不适用于您的目的,这应该是一个更好的解决方案:
基本上,第二个版本只是检查是否有多个条目在您尝试从列表中弹出时将被删除
您可以通过反向索引告诉哪些是重复值-其中键是重复值,值是具有该值的键集(只要输入字典中的值是可散列的,这将起作用):
从最后一个结果很容易获得具有重复值的键集:
相关问题 更多 >
编程相关推荐