如何检查字典中的两个键是否具有相同的值

2024-04-25 21:59:51 发布

您现在位置:Python中文网/ 问答频道 /正文

这似乎是一件很明显的事情,我觉得我错过了一些东西,但是你如何发现同一个字典中的两个不同的键是否具有完全相同的值呢?例如,如果字典test的键ab、和c,并且键ab的值都是10,您如何计算出来?(就问题的关键点而言,请假设有大量的钥匙,比如100个,而您不知道有多少个重复钥匙,如果有多组重复钥匙,或者根本没有重复钥匙)。谢谢


Tags: test字典事情钥匙关键点
3条回答

要检测所有这些病例:

>>> 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']]]
len(dictionary.values()) == len(set(dictionary.values()))

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

基本上,这只是检查当字典的值被强制转换到一个根据定义没有任何重复项的对象时,是否有任何条目被删除

如果上述方法不适用于您的目的,这应该是一个更好的解决方案:

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

基本上,第二个版本只是检查是否有多个条目在您尝试从列表中弹出时将被删除

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

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

相关问题 更多 >