Структура данных Python

Я очень мало знаю о программировании, поэтому это случай, когда вы не знаете, где искать ответ. Я хочу создать структуру данных следующим образом:

vertexTopology = {vertexIndex: {clusterIndexes: intersection point}}

однако кластерные индексы в действительности представляют собой набор, состоящий из индексов кластеров. Так что у меня сейчас есть:

vertexTopology = {5: [[(1, 2, 3), intx_1], 
                      [(2, 3, 4), intx_2]]
                  6: [[(1, 2, 3), intx_3]]
                  ...}

Как создать уникальный индекс, связанный с каждым набором кластеров И его индекс вершины? Что-то вроде:

vertexTopology = {5: {index associated with (1, 2, 3) AND vertex 5, intx_1}, 
                     {index associated with (2, 3, 4) AND vertex 5, intx_2},
                  6: {index associated with (1, 2, 3) AND vertex 6, intx_3}]
                  ...}

Я не уверен, что то, что я ищу, лучше всего использовать со словарями, поэтому любое предложение приветствуется!

Bellow - это изображение четырехточечного пересечения, так что вы можете немного представить, что я имею в виду.

Four point intersection

Ответ 1

В Python есть что-то вроде замороженного набора. Это набор, который вы можете использовать в качестве индекса в словаре.

vertexTopology = {
    5: {
        (frozenset({1, 2, 3}), 5): intx_1,
        (frozenset({2, 3, 4}), 5): intx_2
    },
    6: {
        (frozenset({1, 2, 3}), 5): intx_3
    },
    ...
}

В отличие от наборов, frozensets не поддаются сомнению. Вот почему они могут использоваться как индекс.

Ответ 2

использовать hash() для генерации индекса для набора кластеров и индекса вершин. кортеж - хешируемый тип.

vertexTopology = {5: {hash(((1, 2, 3),5)): intx_1, 
                      hash(((2, 3, 4),5)): intx_2},
                  6: {hash(((1, 2, 3),6)): intx_3},
                  ...}

или используйте кортеж как ключ

vertexTopology = {5: {((1, 2, 3),5): intx_1, 
                      ((2, 3, 4),5): intx_2},
                  6: {((1, 2, 3),6): intx_3},
                  ...}

Если вы используете набор данных, tuple() может легко сделать кортеж из набора

s = set([1, 2, 3])    # s is set
t = tuple(s)    # t is tuple

UPDATE:

если вы хотите использовать другой метод хеширования. str() - простое решение.

In [41]: import hashlib

In [42]: hashed = hashlib.sha512(str(((1, 2, 3), 4))).digest()

In [43]: hashed
Out[43]:
'mtE7\xf6N\xfc\xca\xc7\xb1\x0fA\x86|\xbe9j\xbb\xdf\xbaa\xd1\x05V\x84\xe8S\xfb\xe1\x16\xe05\x89,C\xa8\x94n\xae\x1e\n\xc0Y-)\xfa\xceG D\xe0C\xc9\xef\xb0\x8eCk\xe3`\xc2s\x97\xec'