不可更改类型:“dict”类型E

2024-06-09 07:34:29 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这本字典:

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


Tags: key代码字典titlevalueitemsdescriptionsomething
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())],[]))):

您正在尝试创建一组dict,但这是不可能的,因为dict是不可更改的(因为它们是可变的——它们是否相等可以在修改/添加/删除dict中的对时更改)。

也许不使用dict,您可以将它们的值的元组用于您的集合、laif 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())):或类似的集合?

编辑:如果必须使用集合,正如其他人指出的那样,必须使用像元组这样的散列对象:

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中确实存在重复项,则无法预测此词典的键是什么。

相关问题 更多 >