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

Python remove keys with the same value on a dictionary

我需要对字典执行非 "natural" 操作,所以我想知道执行此操作的最佳 pythonic 方法是什么。

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

例如: 输入:

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

预期输出:

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

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

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

>>> 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 不可哈希;不能直接作为key使用

顺便说一句,不要使用 dict 作为变量名。它将隐藏内置 function/type 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]}

这将比使用创建字典和反转值更有效,因为您只需要强制转换为元组一次,而不是从元组转换回列表。

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

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

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

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

这对我有用:

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