Структура данных 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'