如何检查dict中的两个键是否保持相同的值

时间:2013-07-23 21:05:53

标签: python

这似乎是一件显而易见的事情,我觉得我错过了某些东西,但你怎么知道同一个字典中的两个不同的键是否具有完全相同的值?例如,如果您的字典test包含密钥abc,并且密钥ab都有值10,你怎么想出来的? (关于问题,请假设大量的密钥,比如说100,并且您不知道有多少重复项,如果有多组重复项,或者根本没有重复项)。感谢。

7 个答案:

答案 0 :(得分:7)

要检测所有这些情况:

>>> 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']]]

答案 1 :(得分:7)

len(dictionary.values()) == len(set(dictionary.values()))

这是假设你唯一想知道的是,是否有任何重复的值,而不是哪些值是重复的,这是我从你的问题中假设的。如果我误解了这个问题,请告诉我。

基本上这只是检查当字典的值被转换为根据定义没有任何重复的对象时是否删除了任何条目。

如果上述内容无法满足您的需求,那么这应该是更好的解决方案:

set(k for k,v in d.items() if d.values().count(v) > 1))

基本上第二个版本只是检查是否有多个条目如果你尝试从列表中弹出它将被删除。

答案 2 :(得分:5)

您可以通过反向索引告诉哪些是重复值 - 其中键是重复值,值是具有该值的键组(这将起作用因为输入字典中的值是hashable):

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'])

答案 3 :(得分:3)

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']}

然后,您可以过滤结果的键,该键具有包含多个元素的值(列表),例如已找到重复

答案 4 :(得分:1)

构建另一个dict,将第一个dict的值映射到包含该值的所有键:

import collections

inverse_dict = collections.defaultdict(list)
for key in original_dict:
    inverse_dict[original_dict[key]].append(key)

答案 5 :(得分: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

对列表中的元素进行排序时,您会发现相等的值总是一起出现!

答案 6 :(得分:0)

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)搜索。因此,如果不够好,请更好地重新考虑您的数据结构选择。