我需要做一个不自然的"在字典上操作,所以我想知道最好的pythonic方法是什么。
我需要通过删除相同值的所有键来简化字典(键是不同的,值是相同的)
例如: 输入:
dict = {key1 : [1,2,3], key2: [1,2,6], key3: [1,2,3]}
预期产出:
{key1 : [1,2,3], key2:[1,2,6]}
我不关心删除哪个键(例如:key1或key3)
答案 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)