如何检查字典中存在的重复值?

时间:2015-08-08 22:05:01

标签: python-2.7

我想映射一个以字典作为输入并返回键列表的函数。 列表中的键必须只是字典中的唯一值。

所以,这就是我所做的。

bDict={}
for key,value in aDict.items():
    if bDict.has_key(value) == False:
        bDict[value]=key
    else:
        bDict.pop(value,None)

这是输出:

>>> aDict.keys()
Out[4]: [1, 3, 6, 7, 8, 10]

>>> aDict.values()
Out[5]: [1, 2, 0, 0, 4, 0]

>>> bDict.keys()
Out[6]: [0, 1, 2, 4]

>>> bDict.values()
Out[7]: [10, 1, 3, 8]

但是,预期输出应为bDict.values()[*1,3,8*]

4 个答案:

答案 0 :(得分:1)

这可能会有所帮助。

CODE

aDict = { 1:1, 3:2, 6:0, 7:0, 8:4, 10:0, 11:0}
bDict = {}

for i,j in aDict.items():
    if j not in bDict:
        bDict[j] = [i]

    else:
        bDict[j].append(i)

print map(lambda x: x[0],filter(lambda x: len(x) == 1,bDict.values()))

<强>输出

[1, 3, 8]

答案 1 :(得分:1)

所以看起来你正在创建一个新的字典,其中键和值被反转,保持对的值是唯一的。您可以先找出哪些项目是唯一的,然后再建立一个字典。

def distinct_values(d):
    from collections import Counter
    counts = Counter(d.itervalues())
    return { v: k for k, v in d.iteritems() if counts[v] == 1 }

这产生以下结果:

>>> distinct_values({ 1:1, 3:2, 6:0, 7:0, 8:4, 10:0 })
{1: 1, 2: 3, 4: 8}

答案 2 :(得分:0)

这是一个解决方案(使用两个版本的aDict来测试另一个解决方案失败的rand案例):

#aDict = { 1:1, 3:2, 6:0, 7:0, 8:4, 10:0}
aDict = { 1:1, 3:2, 6:0, 7:0, 8:4, 10:0, 11:2}
seenValues = {}
uniqueKeys = set()

for aKey, aValue in aDict.items():

    if aValue not in seenValues:
        # Store the key of the value, and assume it is unique
        seenValues[aValue] = aKey
        uniqueKeys.add(aKey)

    elif seenValues[aValue] in uniqueKeys:
        # The value has been seen before, and the assumption of
        # it being unique was wrong, so remove it 
        uniqueKeys.remove(seenValues[aValue])
        print "Remove non-unique key/value pair: {%d, %d}" % (aKey, aValue) 

    else:
        print "Non-unique key/value pair: {%d, %d}" % (aKey, aValue) 
print "Unique keys: ", sorted(uniqueKeys)

这会产生输出:

  

删除非唯一键/值对:{7,0}
  非唯一键/值对:{10,0}
  删除非唯一键/值对:{11,2}
  唯一键:[1,8]

或使用aDict的原始版本:

  

删除非唯一键/值对:{7,0}
  非唯一键/值对:{10,0}
  唯一键:[1,3,8]

答案 3 :(得分:0)

作为python 2.7 one-liner,

[k for k,v in aDict.iteritems() if aDict.values().count(v) == 1]


注意上面的

  • 多次调用aDict.values(),对字典中的每个条目调用一次,
  • 为每个复制值多次调用aDict.values().count(v)

如果字典很小,这不是问题。如果字典不小,则创建和销毁这些重复列表以及对count()的重复调用可能代价高昂。缓存adict.values()的值可能会有所帮助,它也可能有助于创建一个字典,将字典中的值映射到出现次数作为字典条目值。