Создание набора наборов возвращает непригодный тип: «список» - PullRequest
0 голосов
/ 30 марта 2019
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 ]

2 голосов
/ 30 марта 2019

Вместо создания набора списков, просто отсортируйте список и преобразуйте его в кортежи (чтобы избежать дублирования):

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 голос
/ 30 марта 2019

Элемент набора должен быть хэшируемым, что означает неизменяемый, используйте кортеж вместо списка.Или вы можете использовать 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))

Надеюсь, что это поможет вам.

...