#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'))
. Сортировка значений, вероятно, является самым быстрым способом защиты от этого.