Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不易损坏类型:';dict';类型错误_Python_Dictionary_Python 3.3 - Fatal编程技术网

Python 不易损坏类型:';dict';类型错误

Python 不易损坏类型:';dict';类型错误,python,dictionary,python-3.3,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', 'descrip

假设我有这本字典:

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:unhabable type:'dict'
。我不知道为什么会发生这种情况,以及如何解决它


这是我的灵感来源,也是我解决这个问题的失败尝试

您正在尝试创建一组dict,但这是不可能的,因为dict是不可损坏的(因为它们是可变的——它们是否相等可能会随着您在dict中修改/添加/删除对而改变)


也许你不需要使用DICT,你可以为你的集合使用它们的值的元组,a la
如果没有设置((v['description\u a'],v['description\u b])为v in value.values())。issubset((v['description\u a'],v['description\u b])为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)
唯一的\u项提供:

{1: {'description': u'testing456', 'title': u'testing123'},
 6: {'description': u'somethingelse', 'title': u'somethingelse'}}
如果
不是很大(或者,至少如果输出字典预计不是很大):

(假设字典示例中的第一个键应该是
title
)。但是,如果在
项中确实存在重复项,则无法预测此词典的键是什么。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值。差别很大!事实上,代码的这一部分工作得很好。错误在我执行赋值时的部分
dic[key]=value
解决原始问题不是我所要求的。请回答这个问题的主要问题,它与我收到的错误背后的原因有关。啊-好的:没有意识到你正在寻找一个基于
集的解决方案。我编辑了我的答案以提供答案。当我运行代码时,我得到
TypeError:只能将列表(而不是“dict\u值”)连接到列表
。我使用的是Python3.4,对于Python3.4,请这样尝试:如果没有设置(value.values()).issubset(set(sum([list(x.values())for x in list(dic.values())],[]):很好,现在可以很好地工作了。谢谢
if not set(value.values()).issubset(set(sum([list(x.values()) for x in list(dic.values())],[]))):