不可用类型:'dict'类型错误

时间:2014-12-12 02:14:49

标签: python dictionary python-3.3

假设我有这本词典:

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的启发,以及我尝试解决它的失败。

3 个答案:

答案 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())):或类似?