这似乎是一件显而易见的事情,我觉得我错过了某些东西,但你怎么知道同一个字典中的两个不同的键是否具有完全相同的值?例如,如果您的字典中test包含键a,b和c,以及键a和b值都为10,那么您如何计算出来?(关于问题,请假设大量的密钥,比如说100,并且您不知道有多少重复项,如果有多组重复项,或者根本没有重复项).谢谢.
要检测所有这些情况:
>>> 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']})
Run Code Online (Sandbox Code Playgroud)
@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']]]
Run Code Online (Sandbox Code Playgroud)
len(dictionary.values()) == len(set(dictionary.values()))
Run Code Online (Sandbox Code Playgroud)
这是假设您唯一想知道的是,是否存在任何重复值,而不是哪些值是重复的,这是我从您的问题中假设的.如果我误解了这个问题,请告诉我.
基本上这只是检查当字典的值被转换为根据定义没有任何重复的对象时是否删除了任何条目.
如果上述内容不适用于您的目的,这应该是一个更好的解决方案:
set(k for k,v in d.items() if d.values().count(v) > 1))
Run Code Online (Sandbox Code Playgroud)
基本上,第二个版本只是检查是否有多个条目,如果你尝试将其从列表中弹出,将被删除.
您可以通过反向索引来确定哪些是重复值-其中的键是重复的值,而值是具有该值的键的集合(只要输入字典中的值可哈希即可使用) :
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'])}
Run Code Online (Sandbox Code Playgroud)
从最后的结果中,很容易获得具有重复值的键集:
set.union(*dd.values())
=> set(['y', 'x', 'a', 'w'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11323 次 |
| 最近记录: |