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中。
答案 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))
希望对您有帮助。