【问题标题】:Unhashable type: 'list' in dictionary不可散列的类型:字典中的“列表”
【发布时间】:2019-08-29 03:30:27
【问题描述】:

我编写了一些代码来从第二个字典中获取新值并添加到新字典中。

这是两个字典:

a = {armani: jeans, dolce: gabbana}
b = {jeans: robo, jobs: versace}

这是代码: {k:b[v] for k,v in a.items() if v in b}

但是,我收到以下错误:unhashable type: 'list' 我知道这可能是因为我对b[v] 的值类似于[[20], [30], [35]]

在过去的几个小时里,我的脑袋一直在发疯。我敢肯定它是如此之小

【问题讨论】:

  • list 对象不能用作dict 中的键,因为它是可变且不可散列的。尝试使用不可变对象,例如tuple
  • 那么在这种情况下如何解决?我试过{k:tuple(b[v]) for k,v in a.items() if v in b},但还是不行
  • 不,键不能是 list 对象,而不是值。您必须更改v,而不是b[v]。也许,b[tuple(v)].
  • @HouLu 仍然遇到同样的错误 :(
  • 只是检查那些 dict 键和值对象还是应该被引用的字符串?

标签: python python-3.x list dictionary


【解决方案1】:

这不是那么小。在继续您的流程之前,您需要了解一些概念。

字典允许您使用诸如字符串或整数之类的键而不是索引(如列表)来访问它们的值,对吗?好吧,幕后应该有一种机制来实现这一点,称为哈希。

每次将键:值对放入字典中时,都会为该键计算哈希值。对于不可变对象(创建后无法更改,只能重新创建的对象),对于相同的字符串或整数或其他不可变对象,哈希值始终相同,这就是字典使用键访问其值的方式。

另一方面,可变对象不能被散列。因此不适合用作字典中的键。而list 就是其中之一。

如果必须,您可以将列表转换为元组以在字典中将其用作键。

lst = [1, 2, 3]
tup = tuple(lst)

请记住,创建后不能更改元组的元素,例如;

tup[0] = 1

这就是为什么它是不可变的。如果您需要更改其值,则只能将其替换为另一个元组。

注意:元组也不能包含列表作为元素,如果它需要用于散列(这会使其可变)。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多