LINUX.ORG.RU

Как сделать множество множеств в python?

 


0

1

Привет, ЛОР!
Делаю я библиотечку для Питона, которая будет решать нужные мне математические задачи. Делаю функцию, которая по числу n выдаёт множество всех представлений числа n в сумму неотрицательных слагаемых. Например, f(2) = {{1, 1}, {2, 0}}. При встрече со строчкой if n==1: return {{1}} питон говорит мне «unhashable type 'set' ». Как правильно?

★★

Последнее исправление: CYB3R (всего исправлений: 2)

Ответ на: комментарий от yura_ts

На 2.7 работает ещё. Ну да не суть, выше правильный ответ подсказали.

python doc

To represent sets of sets, the inner sets must be frozenset objects.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Значит, таки упёрся в возможности языка :(

yura_ts ★★
() автор топика

выдаёт множество всех представлений числа n в сумму неотрицательных слагаемых.

Кто мешает использовать массив множеств? Какие «множественные» методы ты хочешь применять к самому множеству?

router ★★★★★
()
Ответ на: комментарий от schizoid

Ну, можно, но не хочется отдельно проверять большое множество на то, одинаковые ли там элементы или нет. Исходная задача была «найти максимальное множество элементов в группе (данной), попарно коммутирующих между собой».

yura_ts ★★
() автор топика

f(2) == [[1,1], [2,0]]

anonymous
()
Ответ на: комментарий от yura_ts

не хочется отдельно проверять большое множество на то, одинаковые ли там элементы

А надо ли? Насколько я понял, ты это множество-множество получаешь от доверенной функции. Соответственно, и внутри неё тоже множество-множество не нужно, ибо алгоритм предполагает результат уникальными элементами.

schizoid ★★★
()

Ты можешь унаследовать свой set который будет умнее чем встроенный. Или вообще свою имплементацию. Но мне кажется можно обойтись без этого.

true_admin ★★★★★
()

Вот это да, питон-то, оказывается, не может даже во вложенные сеты без костылей. Как этим говном пользуются вообще, лол?

anonymous
()
Ответ на: комментарий от anonymous

Вот это да, питон-то, оказывается, не может даже во вложенные сеты без костылей

На самом деле это полностью оправдано. Основная фишка сетов это доступ за константное время, для этого объект должен иметь неизменный хеш, что невозможно при его мутабельности.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Ясно, я забыл, что основная фишка сетов - это доступ за константное время. Тогда все нормально.

anonymous
()
Ответ на: комментарий от power

А кто может без костылей?

scala> val x1 = Set(Set(1, 1), Set(2, 0))

scala> val x2 = Set(Set(0, 2), Set(1))

scala> val x3 = Set(Set(1))

scala> x1 == x2
res0: Boolean = true

scala> x2 == x3
res1: Boolean = false
dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от power

Все нормальные языки могут.

> let x = Set.fromList [Set.fromList [1,1], Set.fromList[2,0]]
> let y = Set.fromList [Set.fromList [0,2], Set.fromList[1]]
> let z = Set.fromList [Set.fromList [1]]
> x == y
True
> y == z
False

anonymous
()
Ответ на: комментарий от Virtuos86

А когда список стал иммутабельным?

А когда в сеты можно было загонять списки?

set([[1]])

python2.5: TypeError: list objects are unhashable
python2.6: TypeError: unhashable type: 'list'
python2.7: TypeError: unhashable type: 'list'

mix_mix ★★★★★
()
Ответ на: комментарий от anonymous

Все нормальные языки могут.

Так Set.fromList ничем от frozenset и не отличается.

mix_mix ★★★★★
()
Ответ на: комментарий от anonymous

Не используй множества. Используй списки

Это правильный совет. Могу добавить ещё один:

Не используй питон. Используй язык обработки списков.

P.S. Отныне тред захвачен лисперами.

ugoday ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.