2015-08-08 107 views
-3

我想映射一个将字典作为输入并返回键列表的函数。 列表中的键必须只有字典中存在的唯一值。如何检查字典中存在的重复值?

所以,这就是我所做的。

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

+0

一个想法是遍历键上的字典,并将值作为键插入到另一个字典中。如果新密钥存在,则您的原始字典中有一个双重值。 – holroy

+1

对原始字典进行普通遍历,并且您将同时具有键和值。如果你不知道怎么做,请找一本关于字典的教程 – holroy

+0

所以,这就是我所做的。 值= aDict.values() 键= aDict.keys() bDict = {} 为键,在aDict.items()值: 如果bDict.has_key(值)==题: bDict [值] =键 否则: bDict.pop(值,无) 这是输出: aDict.keys() 输出[4]:[1,3,6,7,8,10] aDict .values() 缺货[5]:[1,2,0,0,4,0] bDict.keys() 缺货[6]:[0,1,2,4] bDict.values () Out [7]:[10,1,3,8] 但预期的输出应该是bDict.Values:[1,3,8] 编辑我原来的帖子,因为这是混乱。 –

回答

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())) 

OUTPUT

[1, 3, 8] 
+1

它与当前的'aDict'协同工作,但失败时会出现'aDict = {1:1,3:2,6:0,7:0,8:4,10:0,11:2}'等集合。请注意,值2只设置两次,而不是三次(值为0)。由于在当前的'elif'块中删除而失败。 – holroy

+1

现在看起来更像它了。但是,我不喜欢我的,也不是你的解决方案是非直观的变量名称... – holroy

+0

对不起,但你认为添加lambda函数使它更具可读性吗?! :-)删除的'blocked'变量可能是最直观的变量名称。 'i'和'j'呢?此外,当向'aDict'添加'11:2'时,现在又失败了。请在发布之前用一些输入变量测试你的代码 – holroy

0

这里是一个溶液(与aDict的两个版本,以测试其在另一种解决方案失败兰特情况):

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

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} 
+0

OP没有要求一个新的字典,只是为了得到值的唯一键的列表,据我了解的问题是。 – holroy

+0

如果只返回密钥列表,似乎可以使用:'返回[k代表k,v代替d.iteritems()如果计数[v] == 1]' – holroy

+0

他要求一个字典,它有那些价值... –

0

为Python 2。7单行,

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


注意上面

  • 呼叫aDict.values()多次,一旦为字典中的每个条目,针对每个已复制的值
  • 呼叫aDict.values().count(v)多次。

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