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())],[]))):