这似乎是一件很明显的事情,我觉得我错过了一些东西,但是你如何确定同一个字典中的两个不同的键是否具有完全相同的值?例如,如果您有一个test
带有键a
、、b
和c
和键的字典,a
并且b
它们的值都是 10,那么您将如何计算呢?(对于问题的重点,请假设有大量的键,比如 100 个,并且您不知道有多少重复项,是否有多组重复项,或者是否有重复项)。谢谢。
7 回答
len(dictionary.values()) == len(set(dictionary.values()))
这是假设您唯一想知道的是是否有任何重复的值,而不是哪些值是重复的,这是我从您的问题中假设的。如果我误解了这个问题,请告诉我。
基本上,这只是检查当字典的值被强制转换为根据定义没有任何重复的对象时是否删除了任何条目。
如果上述方法不适用于您的目的,这应该是一个更好的解决方案:
set(k for k,v in d.items() if d.values().count(v) > 1))
基本上,第二个版本只是检查如果您尝试将其从列表中弹出,是否有多个条目将被删除。
要检测所有这些情况:
>>> import collections
>>> d = {"a": 10, "b": 15, "c": 10}
>>> value_to_key = collections.defaultdict(list)
>>> for k, v in d.iteritems():
... value_to_key[v].append(k)
...
>>> value_to_key
defaultdict(<type 'list'>, {10: ['a', 'c'], 15: ['b']})
@hivert 提出了一个很好的观点,即这仅在值是可散列的情况下才有效。如果不是这种情况,则没有很好的 O(n) 解决方案(遗憾的是)。这是我能想到的最好的:
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'])}
从最后一个结果很容易获得具有重复值的键集:
set.union(*dd.values())
=> set(['y', 'x', 'a', 'w'])
dico = {'a':0, 'b':0, 'c':1}
result = {}
for val in dico:
if dico[val] in result:
result[dico[val]].append(val)
else:
result[dico[val]] = [val]
>>> result
{0: ['a', 'b'], 1: ['c']}
然后,您可以过滤具有多个元素的值(列表)的结果键,例如已找到重复项
构建另一个 dict 将第一个 dict 的值映射到包含该值的所有键:
import collections
inverse_dict = collections.defaultdict(list)
for key in original_dict:
inverse_dict[original_dict[key]].append(key)
keys = set()
for key1 in d:
for key2 in d:
if key1 == key2: continue
if d[key1] == d[key2]:
keys |= {key1, key2}
即这就是你想要的 Θ(n²)。原因是 dict 在给定值的情况下不提供对键的 Θ(1) 搜索。因此,如果这还不够好,最好重新考虑您的数据结构选择。
您可以结合使用列表和字典来查找重复元素!这是一个演示相同的简单代码:
d={"val1":4,"val2":4,"val3":5,"val4":3}
l=[]
for key in d:
l.append(d[key])
l.sort()
print(l)
for i in range(len(l)):
if l[i]==l[i+1]:
print("true, there are duplicate elements.")
print("the keys having duplicate elements are: ")
for key in d:
if d[key]==l[i]:
print(key)
break
输出:
runfile('C:/Users/Andromeda/listeqtest.py', wdir='C:/Users/Andromeda')
[3, 4, 4, 5]
true, there are duplicate elements.
the keys having duplicate elements are:
val1
val2
当您对列表中的元素进行排序时,您会发现相等的值总是一起出现!