Проектирование структуры данных Python

#python #data-structures

#python #структуры данных

Вопрос:

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

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

Пример:

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

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

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

Комментарии:

1. @phooji: Нет. я просто не мог придумать какую-либо чистую и хорошую реализацию этого и искал совет эксперта.

2. @phooji: Я тоже задавался этим вопросом, но другие его вопросы кажутся законными.

3. Изменяемы ли объекты? Можно object_123 получить новые ключи или измененные значения или и то, и другое?

4. @S.Лотт: в данном конкретном случае они неизменяемы, но было бы интересно, как это реализуется с изменяемыми объектами?

5. @ahojnnes,@Kirk Strauser: Спасибо — просто уточняю.

Ответ №1:

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

 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
  

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

Комментарии:

1. 1, хотя часть меня задается вопросом, есть ли способ, которым namedtuple мог бы помочь…

Ответ №2:

Я думаю, что SQLite or — это то, что вам нужно. Возможно, это не реализовано с помощью стандартных структур python, но доступно через стандартную библиотеку.

Ответ №3:

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

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