You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成不重复勾股三元组时遇TypeError: unhashable type: 'list'问题求助

解决Python中集合存储勾股三元组的TypeError问题

首先,咱们来拆解你遇到的错误:TypeError: unhashable type: 'list'。集合(set)的核心特性是存储不可重复、可哈希的元素,而列表(list)是可变类型,无法被哈希,所以你试图把[i,j,k]添加到集合里时就触发了这个错误——哪怕你给列表套了一层括号,它本质还是个列表。

第一步:修复TypeError

把列表换成元组(tuple)就可以解决这个问题,因为元组是不可变类型,支持哈希。但直接存(i,j,k)还不够,因为(3,4,5)和(4,3,5)会被集合当成两个不同的元素,不符合你“视为相同”的需求。

第二步:实现真正的去重

有两种简单的方式解决重复问题:

方式1:先排序再转元组

对每个符合条件的三元组排序,确保不管i和j的顺序如何,最终存入集合的都是同一个有序元组:

S = set()
for i in range(1, 100):
    for j in range(1, 100):
        for k in range(1, 100):
            if i**2 + j**2 == k**2:
                # 排序后转元组,统一三元组的顺序
                sorted_triplet = tuple(sorted((i, j, k)))
                S.add(sorted_triplet)
print(S)

方式2:优化循环减少重复生成

更高效的做法是调整循环范围,让j从i开始遍历,这样i <= j,自然生成的三元组都是有序的,不需要额外排序,还能减少一半的循环次数:

S = set()
for i in range(1, 100):
    # j从i开始,避免重复的(i,j)组合
    for j in range(i, 100):
        for k in range(1, 100):
            if i**2 + j**2 == k**2:
                S.add((i, j, k))
print(S)

额外优化(可选)

你还可以进一步减少k的循环范围,因为k必须大于i和j(勾股数中斜边最长),所以k可以从max(i,j)+1开始到100,这样能大幅减少不必要的循环:

S = set()
for i in range(1, 100):
    for j in range(i, 100):
        # k的最小值是max(i,j)+1,最大值是99
        for k in range(max(i, j) + 1, 100):
            if i**2 + j**2 == k**2:
                S.add((i, j, k))
print(S)

这样不仅解决了TypeError,还完美实现了你要的“不重复勾股三元组”需求,同时提升了代码运行效率。

内容的提问来源于stack exchange,提问作者Diego

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:47:19