2010-07-15 51 views
3

我想要一个字典中唯一的重复值。它看起来像这样:如何根据价值独特的字典?

d = { 
"a":1, 
"b":2, 
"c":2, 
"d":3, 
"e":4, 
"f":5, 
"g":1, 
"h":2, 
"i":2, 
"j":1, 
"k":1} 

这里是我做过什么:

# sort and unique the dict values 
obj = d.values() 
K = [] 
K = sorted(list(zip(*[(x,K.append(x)) for x in obj if not x in K])[0] 

V=[] 
for v1 in L: 
    V.append([k for k, v in obj.iteritems() if v == v1][0]) 
d_out = dict(zip(K, V)) 

1. 因此,将K,V是在正确的顺序? 此外,它可能有点复杂,任何人都可以通过它的值给一个简单的解决方案来独特的字典?

2. 下面可以更简单吗?

for v1 in L: 
    V.append([k for k, v in obj.iteritems() if v == v1][0]) 

这不是工作在我的测试:

[V.append([k for k, v in obj.iteritems() if v == v1][0]) for v1 in L] 

3. 我意识到,我可以使用交换键值以实现(唯一一个由它的价值字典),但我没有知道如何选择关键时候掉造成本的关键冲突:

dict((value, key) for key, value in my_dict.iteritems()) 

我知道,如果交换一遍值将是唯一的,但,当关键冲突发生时,这只会覆盖密钥,没有机会做出选择。我感到困惑为什么这不会导致关键冲突错误?我可以做些什么来选择旁边的丑陋的方式键覆盖新的字典的关键?

4. 我搜索,找到一些“无”值蟒蛇字典很好的讨论,任何人都可以给我它是干什么用的样本,它会在使用python字典影响?

+0

感谢jathanism,我想你的意思是我应该打勾在别人的答案,而不是增加了使用价值。 – 2010-07-16 02:55:45

回答

1
try it out: 

from collections import defaultdict 
dout = defaultdict(dict) 
for k,v in d.iteritems(): 
    dout[v] = k 
dout = dict(dout) 
fdict = dict(zip(dout.values(), dout.keys())) 

N.B:字典没有重复键,使输入的字典里没有重复键 希望它会工作

+0

感谢,交换2次真的不能解决我的问题,因为我已经对我的问题进行了定义,但是假设值会被复制,那么如何在新生成的字典中选择键值<->值对?我可以放哪个控制点? – 2010-07-15 10:34:32

3
  1. 的字典是不是序列。没有订购。

  2. 您需要一个更简单的整体方法。

  3. 字典不会给出“关键冲突错误”。它假定您想用新值覆盖旧值。

  4. 我不明白你在问什么。

下面的解决方案是从字典中删除dupe值更直接的方法。调整排序或插入循环以控制哪些键应出现在最终字典中。

d = { 
    "a":1, 
    "b":2, 
    "c":2, 
    "d":3, 
    "e":4, 
    "f":5, 
    "g":1, 
    "h":2, 
    "i":2, 
    "j":1, 
    "k":1} 

# Extract the dictionary into a list of (key, value) tuples. 
t = [(k, d[k]) for k in d] 

# Sort the list -- by default it will sort by the key since it is 
# first in the tuple. 
t.sort() 

# Reset the dictionary so it is ready to hold the new dataset. 
d = {} 

# Load key-values into the dictionary. Only the first value will be 
# stored. 
for k, v in t: 
    if v in d.values(): 
     continue 
    d[k] = v 

print d 
1

也许这是一些帮助:

import collections 

d = ... # like above 
d1 = collections.defaultdict(list) 

for k, v in d.iteritems(): 
    d1[v].append(k) 

print d1