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

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

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

6
задан dsimcha 11 February 2010 в 19:39
поделиться

3 ответа

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

2
ответ дан 17 December 2019 в 20:31
поделиться

Возможно, вы вызываете функцию (прямо или косвенно) из конструктора базового класса, который сам не имеет этой функции.

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

Возможно (но маловероятно), вы каким-то образом уничтожили таблицу vtable.

Является ли указатель на функцию нулевым только для этого объекта или для всех других объектов того же типа? Если первый, то указатель vtable сломан, и вы смотрите не туда. Если последний, то разбивается сам vtable.

-121--4817568-

Другим возможным решением является использование ViewFlipper или ViewSwitcher в качестве раздела "Content", в который включаются различные типы содержимого, между которыми требуется переключиться, и только задание представления, которое требуется отобразить (можно также выполнять анимацию на flip/switch). Недостатком является то, что содержимое должно быть добавлено в основной макет, который каждый вид является дочерним по отношению к ViewFlipper/ViewSwitcher (может использоваться или также для сохранения макетов в отдельных XML-файлах).

Делегирование рендеринга коммутируемого содержимого другому действию не является таким прямым. TabHost/TabWidget допускает, что, где область содержимого хоста табуляции создается из другого действия. В качестве примера можно использовать код Tab, если это необходимо.

-121--3076001-

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

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

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

>>> 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 для добавления проверки.

0
ответ дан 17 December 2019 в 20:31
поделиться

Недавно был выпущен модуль larry для Python. Я верю, что он делает то, что вы хотите.

0
ответ дан 17 December 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: