Ассоциативные матрицы? - PullRequest
       20

Ассоциативные матрицы?

6 голосов
/ 11 февраля 2010

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

Очевидный способ выразить это с помощью ассоциативного массива ассоциативных массивов, но это и неудобно, и неэффективно, и оно не обеспечивает свойство не зубчатости Предоставляют ли какие-либо популярные языки программирования ассоциативную матрицу, встроенную в язык или являющуюся частью их стандартных библиотек? Если да, то как они работают, как на уровне API, так и на уровне реализации? Я использую Python и D для этого проекта, но примеры на других языках все равно будут полезны, потому что я смогу взглянуть на API и найти лучший способ реализовать нечто подобное в Python или D.

Ответы [ 3 ]

2 голосов
/ 11 февраля 2010

Почему бы просто не использовать стандартную матрицу, а затем иметь два словаря - один, который преобразует ключи строк в индексы строк, а другой - преобразует ключи столбцов в индексы столбцов. Я думаю, вы могли бы создать свою собственную структуру, которая бы работала таким образом довольно легко. Вы просто создаете класс, который содержит матрицу и два словаря, и идете оттуда.

0 голосов
/ 11 февраля 2010

модуль larry для python был недавно выпущен. я верю, что он делает то, что ты хочешь.

0 голосов
/ 11 февраля 2010

В Python вы можете индексировать dict с помощью кортежа из двух строк, например,

>>> d = {}
>>> d["foo","bar"] = 10
>>> d
{('foo', 'bar'): 10}

Я не уверен, что означает для вас «принудительное выполнение без неровностей», но вы можете либо использовать defaultdict, чтобы вернуть значение по умолчанию для записей, которые не были явно установлены, либо инициализировать dict с известным значением:

>>> xkeys = "abcdef"
>>> ykeys = "xyz"
>>> d = dict(((x,y), 0) for x in xkeys for y in ykeys)
>>> d
{('b', 'y'): 0, ('a', 'z'): 0, ('b', 'x'): 0, ('e', 'y'): 0, ('a', 'x'): 0, ('f', 'z'): 0, ('a', 'y'): 0, ('f', 'y'): 0, ('d', 'y'): 0, ('f', 'x'): 0, ('d', 'x'): 0, ('e', 'x'): 0, ('e', 'z'): 0, ('c', 'x'): 0, ('d', 'z'): 0, ('c', 'y'): 0, ('c', 'z'): 0, ('b', 'z'): 0}

Если вы хотите, чтобы разрешались только ключи в известном наборе, то я предлагаю подклассифицировать dict, чтобы добавить проверку.

...