假设我有这本词典:
items = {1: {'title': u'testing123', 'description': u'testing456'},
2: {'description': u'testing123', 'description': u'testing456'},
3: {'description': u'testing123', 'description': u'testing456'},
4: {'description': u'testing123', 'description': u'testing456'},
5: {'description': u'testing123', 'description': u'testing456'},
6: {'description': u'somethingelse', 'description': u'somethingelse'}}
我想过滤掉重复的值,以便最终得到
{1: {'title': u'testing123', 'description': u'testing456'}, 6: {'title': u'something', 'description': u'somethingelse'}}
我写了这段代码:
dic = {}
for key, value in items.items():
if not set(value.values()).issubset(set(dic.values())):
dic[key] = value
但是我收到错误消息TypeError: unhashable type: 'dict'
。我不确定为什么会发生这种情况以及如何解决这个问题。
这受到another question的启发,以及我尝试解决它的失败。
答案 0 :(得分:3)
dic.values()返回dict列表
>>> for key, value in items.items():
... print dic.values()
...
[{'description': u'testing456', 'title': u'testing123'}]
[{'description': u'testing456', 'title': u'testing123'}]
[{'description': u'testing456', 'title': u'testing123'}]
[{'description': u'testing456', 'title': u'testing123'}]
[{'description': u'testing456', 'title': u'testing123'}]
[{'description': u'testing456', 'title': u'testing123'}]
>>>
所以,你不能在dict上应用set,因为dict不可以使用。
顺便说一句,你可以通过以下方式修复它:
>>> dic = {}
>>> for key, value in items.items():
... if not set(value.values()).issubset(set(sum([x.values() for x in dic.values()],[]))):
... dic[key] = value
...
>>> dic
{1: {'description': u'testing456', 'title': u'testing123'}, 6: {'description': u'somethingelse', 'title': u'somethingelse'}}
>>>
对于python> 3.X
if not set(value.values()).issubset(set(sum([list(x.values()) for x in list(dic.values())],[]))):
答案 1 :(得分:1)
编辑:如果你必须使用一个集合,正如其他人已经注意到你必须使用像元组一样的可散列对象:
unique_items = set()
for k, v in items.items():
sorted_v = tuple(sorted((k2, v2) for k2, v2 in v.items()))
unique_items.add(sorted_v)
unique_items = dict(unique_items)
给出了unique_items
:
{1: {'description': u'testing456', 'title': u'testing123'},
6: {'description': u'somethingelse', 'title': u'somethingelse'}}
如果items
不是很大(或者,至少如果输出词典不是很大的话):
items = {1: {'title': u'testing123', 'description': u'testing456'},
2: {'title': u'testing123', 'description': u'testing456'},
3: {'title': u'testing123', 'description': u'testing456'},
4: {'title': u'testing123', 'description': u'testing456'},
5: {'title': u'testing123', 'description': u'testing456'},
6: {'title': u'somethingelse', 'description': u'somethingelse'}}
unique_items = {}
for k, v in items.items():
if v not in unique_items.values():
unique_items[k] = v
(假设词典示例中的第一个键应为title
)。但是,如果items
中存在重复项,则无法预测此词典的键是什么。
答案 2 :(得分:0)
您正在尝试创建一组dicts,但这是不可能的,因为dicts是不可删除的(因为它们是可变的 - 它们是否相同可以随着您在dict中修改/添加/删除对而改变)。
也许不是使用dicts,而是可以使用其值的元组作为集合,la if not set((v['description_a'], v['description_b]) for v in value.values()).issubset((v['description_a'], v['description_b]) for v in set(dic.values())):
或类似?