Дизайн структуры данных Python - PullRequest
1 голос
/ 06 апреля 2011

Структура данных должна соответствовать следующей цели:

  • каждый объект уникален с определенными парами ключ-значение
  • ключи и значения не определены заранее и могут содержать любое строковое значение
  • Запросы на объекты должны быть быстрыми

Пример:

  • object_123({'stupid':True, 'foo':'bar', ...})
  • structure.get({'stupid':True, 'foo':'bar', ...}) должен вернуть object_123

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

Как бы вы это реализовали?

Ответы [ 3 ]

5 голосов
/ 06 апреля 2011

Самое простое решение, которое я могу придумать, это использовать отсортированные ключи кортежей:

def key(d): return tuple(sorted(d.items()))

x = {}
x[key({'stupid':True, 'foo':'bar', ...})] = object_123

x.get(key({'stupid':True, 'foo':'bar', ...})) => object_123

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

0 голосов
/ 06 апреля 2011

Скажи object_123 - это диктат, на который он в значительной степени похож. Ваш structure кажется стандартным диктом с такими клавишами, как (('foo', 'bar'), ('stupid', True)); другими словами, tuple(sorted(object_123.items())), так что они всегда перечислены в определенном порядке.

Причина определенного порядка заключается в том, что dict.items() не гарантирует возвращение списка в указанном порядке. Если ваш словарный ключ (('foo', 'bar'), ('stupid', True)), вам не нужен ложный минус только потому, что вы ищете (('stupid', True),('foo', 'bar')). Сортировка значений, вероятно, самый быстрый способ защиты от этого.

0 голосов
/ 06 апреля 2011

Я думаю SQLite или это то, что вам нужно.Возможно, он не реализован со стандартными структурами Python, но доступен через стандартную библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...