如何根据值唯一化字典?
我想在一个字典中去掉重复的值。它看起来是这样的:
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. 那么,字典中的键和值会按正确的顺序吗? 而且,这可能有点复杂,有没有人能给我一个简单的方法来根据值去重字典?
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字典中的一些"None"值有很多讨论,有人能给我一个例子,说明它是用来做什么的,以及在使用python字典时会有什么影响吗?
3 个回答
1
也许这对你有点帮助:
import collections
d = ... # like above
d1 = collections.defaultdict(list)
for k, v in d.iteritems():
d1[v].append(k)
print d1
2
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()))
注意:字典里不能有重复的键,所以输入的字典里不会有重复的键。希望这样能正常工作。
3
字典(dict)不是一种序列,它没有顺序。
你需要一个更简单的方法来处理这个问题。
字典不会报“键冲突错误”。它会假设你想用新值替换掉旧值。
我不太明白你在问什么。
下面的解决方案是一个更简单的方法,用来从字典中去掉重复的值。你可以调整排序或插入的循环,以控制最终字典中应该出现哪些键。
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