首页 > 解决方案 > TypeError: unhashable type: 'list' 当找到一个产品的组成

问题描述

我读了这样一个问题

A 负责确定 B 的三个孩子的年龄。B 告诉 A 孩子年龄的乘积是 36 岁。在考虑了这条线索后,A 回答说需要另一条线索,所以 B 告诉 A 孩子年龄的总和。再一次,A 回答说需要另一个线索,所以 B 告诉 A 大孩子会弹钢琴。听到这个线索后,甲告诉乙三个孩子的年龄。三个孩子多大了?

进门分析乘积为 36 并尝试过的三元组

In [4]: ll = []
   ...: for x in range(1,37):
   ...:     for y in range(1, 37):
   ...:         for z in range(1, 37):
   ...:             if x * y * z == 36:
   ...:                 l = sorted([x, y,z])
   ...:                 ll.append(l)
   ...:                 s = set(ll)
   ...:                 print(s)
   ...:                 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-cc3ad95c0d1b> in <module>()
      6                 l = sorted([x, y,z])
      7                 ll.append(l)
----> 8                 s = set(ll)
      9                 print(s)
     10 

TypeError: unhashable type: 'list'

我对不可散列的类型列表感到非常困惑。

标签: python

解决方案


set对象是用哈希表实现的。这意味着您存储在其中的所有值都必须是可散列的(意思是,hash(value)必须有效)。

您正在尝试set从包含其他列表的列表中构建一个。不幸的是,列表是不可散列的,所以你会得到你在标题中描述的错误。

有几种方法可以解决此问题。最简单的是使用 atuple而不是你的内部列表。元组是可散列的,只要它们的所有内容也是可散列的(整数也是可散列的,所以它们应该适合你)。

尝试更改ll.append(l)ll.append(tuple(l)),您的代码应该可以工作。


推荐阅读