Python在字典上删除具有相同值的键

时间:2015-02-08 14:58:22

标签: python dictionary

我需要做一个不自然的"在字典上操作,所以我想知道最好的pythonic方法是什么。

我需要通过删除相同值的所有键来简化字典(键是不同的,值是相同的)

例如: 输入:

  dict = {key1 : [1,2,3], key2: [1,2,6], key3: [1,2,3]}

预期产出:

  {key1 : [1,2,3], key2:[1,2,6]}

我不关心删除哪个键(例如:key1或key3)

5 个答案:

答案 0 :(得分:5)

交换密钥和值;重复的键值对将作为副作用删除(因为字典不允许重复的键)。再次交换密钥和值。

>>> d = {'key1': [1,2,3], 'key2': [1,2,6], 'key3': [1,2,3]}
>>> d2 = {tuple(v): k for k, v in d.items()}  # exchange keys, values
>>> d = {v: list(k) for k, v in d2.items()}   # exchange again
>>> d
{'key2': [1, 2, 6], 'key1': [1, 2, 3]}

注意:使用tuple(v)是因为list不可清除;不能直接用作密钥。

顺便说一句,不要使用dict作为变量名。它会影响内置函数/类型dict

答案 1 :(得分:2)

此解决方案删除具有相同值的键,而不创建新词典。

seen = set()
for key in mydict.keys():
    value = tuple(mydict[key])
    if value in seen:
        del mydict[key]
    else:
        seen.add(value) 

答案 2 :(得分:0)

你可以遍历你的dict项并使用一个集来检查我们到目前为止看到的内容,如果我们已经看到了值,则删除一个键:

d = {"key1" : [1,2,3], "key2": [1,2,6], "key3": [1,2,3]}
seen = set()
for k, v in d.items(): # list(items) for python3
    temp = tuple(v) 
    if temp in seen:
        del d[k]
    seen.add(temp)
print(d)
{'key1': [1, 2, 3], 'key2': [1, 2, 6]}

使用创建dict和反转值会更有效,因为你只需要将元组转换为元组而不是从元组返回到列表。

答案 3 :(得分:0)

我认为你也可以这样做。但我没有说因为似乎有更有效的方法。它是在线的。

for i in dictionary.keys():
    if dictionary.values().count(dictionary[i]) > 1:
       del dictionary[i]

答案 4 :(得分:0)

这对我有用:

seen = set()
for key in mydict.copy():
    value = tuple(mydict[key])
    if value in seen:
        del mydict[key]
    else:
        seen.add(value) 
相关问题