进行一组集合将返回不可散列的类型:“列表”

时间:2019-03-30 01:50:10

标签: python list set append

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:
                S.add(([i,j,k]))
print S

,错误是

TypeError                                 Traceback (most recent call last)
<ipython-input-45-606e3083d711> in <module>()
      4         for k in range(1,100):
      5             if i**2+j**2==k**2:
----> 6                 S.add(([i,j,k]))
      7 print S

TypeError: unhashable type: 'list'

我只想获取所有不同的勾股三元组[对我来说(3,4,5)=(4,3,5)]。这就是为什么我要使用集合,但是由于某些原因我无法将集合追加到我的原始集合S中。

2 个答案:

答案 0 :(得分:2)

与其创建一组列表,不如对列表进行排序并转换为元组(以避免重复):

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:
                # Notice I've changed squared brackets to round brackets for tuples, and sorted the list, so that duplicates are eliminated.
                S.add(tuple(sorted([i,j,k])))
print(S)

`

我假设运行时效率目前并不重要。

答案 1 :(得分:1)

set的元素需要是可哈希的,这意味着不可变,请使用元组而不是list。 或者,您也可以使用Frozenset。

对于“ get all the distinct Pythagorean triples [for me (3,4,5)=(4,3,5)].”,您可以将i限制为较小的值,将j限制为较大的值,示例代码如下:

S = set()
for i in range(1, 100):
    # include i to support i=j case
    for j in range(i, 100):
        for k in range(1, 100):
            if i ** 2 + j ** 2 == k ** 2:
                S.add((i, j, k))

希望对您有帮助。