python - 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'
我对不可散列的类型列表感到非常困惑。
解决方案
set
对象是用哈希表实现的。这意味着您存储在其中的所有值都必须是可散列的(意思是,hash(value)
必须有效)。
您正在尝试set
从包含其他列表的列表中构建一个。不幸的是,列表是不可散列的,所以你会得到你在标题中描述的错误。
有几种方法可以解决此问题。最简单的是使用 atuple
而不是你的内部列表。元组是可散列的,只要它们的所有内容也是可散列的(整数也是可散列的,所以它们应该适合你)。
尝试更改ll.append(l)
为ll.append(tuple(l))
,您的代码应该可以工作。
推荐阅读
- java - 在 SWT 表中交换两行的正确方法
- javascript - 如何在正文中显示人员数据
- c# - c#.net在Telnet连接中通过confirm操作
- svelte - 在等待一段时间后显示装载机的苗条方法是什么?
- angular - 如果路径为空,如何使用角度模块重定向到登录页面
- c# - OpenID 连接 ADFS 2019 - 权限无效
- css - 使用 css 融合在一起的圆形文本笔划/轮廓
- datetime - 两个 TimeSpan 之间的秒差不正确
- jquery - jQuery取消绑定事件滚动
- oracle - Hibernate 插入失败 - java.sql.SQLException:调用中的参数无效