【问题标题】:unhashable type: 'dict' Type Error [duplicate]不可散列的类型:'dict'类型错误[重复]
【发布时间】:2014-12-12 02:14:49
【问题描述】:

假设我有这本字典:

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

【问题讨论】:

    标签: python dictionary python-3.3


    【解决方案1】:

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

    【讨论】:

    • 当我运行代码时,我得到TypeError: can only concatenate list (not "dict_values") to list。我在 Python 3.4
    • 对于python 3.4,请尝试这样:if not set(value.values()).issubset(set(sum([list(x.values()) for x in list(dic.values) ())],[]))):
    • 很好,现在效果很好。谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • 解决原始问题不是我要的。请解决这个问题的主要问题,该问题涉及我收到错误背后的原因。
    • 啊 - 好的:没有意识到您正在寻找基于 set 的解决方案。我已经编辑了我的答案以提供一个。
    【解决方案3】:

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

    也许您可以将它们的值的元组用于您的集合,而不是使用字典,例如 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())): 或类似的?

    【讨论】:

    • 那不是一组字典,那是一组字典值。大不同!
    • 事实上,这部分代码工作得很好。错误在我做作业时的部分dic[key] = value
    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2021-12-22
    • 2021-01-10
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多