prizrak-pro
Апрель 23, 2014 09:18:40
Существуют имена привязанные к номерам (идентификаторам).
Задача состоит в том, что бы в одном случаи искать по имени идентификатор. А в другом по идентификатору искать имя.
В начале пытался решить это с помощью списков, но как оказалось в списке можно искать, получить значение, только по ключу (думал, что можно как в php искать ключ по значению).
Возникает 2 варианта.
1) использовать 2 словаря.
2) использовать 2 списка, но тут нужно следить, что бы под одним номером в разных списках были соотносимые значение (хотя это не сложно).
Вопрос. Что менее затратно. 1 вариант представляется мне более безопасным, но насколько он оправдан в решении данной задачи и не слишком ли затратный.
Возможно есть ещё какие то варианты решения.
(можно хранить в базе и получать значение поиском при необходимости, но не хочу каждый раз обращаться в базе)
pyuser
Апрель 23, 2014 09:28:23
prizrak-pro
можно хранить в базе и получать значение поиском при необходимости
И это правильно, зачем дублировать информацию?
Если размер оперативки позволяет, создайте таблицу в памяти.
prizrak-pro
Апрель 23, 2014 12:47:43
Согласен с базой удобнее. Но если это частые смены. И будет очень много обращений в базе. И хочется держать в переменной. Что же удобнее?
4kpt_II
Апрель 23, 2014 13:57:45
База, которая работает в памяти. Если данные напоминают словарь - то гляньте в сторону redis. Она достаточно быстрая и кошерная

Если лень в нем разбираться, то можно запихать в память и sqlite…
py.user.next
Апрель 23, 2014 23:32:00
prizrak-pro
В начале пытался решить это с помощью списков, но как оказалось в списке можно искать, получить значение, только по ключу (думал, что можно как в php искать ключ по значению).
это словарь, а не список
а вот если взять список пар, тогда можно получить поиск O(n)
>>> class KVDict(list):
...
... def findk(self, k):
... for i in self:
... if i[0] == k:
... return i[1]
...
... def findv(self, v):
... for i in self:
... if i[1] == v:
... return i[0]
...
>>> d = KVDict([('a', 1), ('b', 2)])
>>>
>>> d.findk('b')
2
>>> d.findv(2)
'b'
>>> d.findk('a')
1
>>> d.findv(1)
'a'
>>>
prizrak-pro
Апрель 24, 2014 14:32:23
py.user.next, спасибо огромное! То что нужно. Как просто, как сам не догадался
4kpt_II, Redis и в правду интересная система. И ходя мне для решения полностью подойдет пример
py.user.next. По redis почитал и очень понравилась. Будет посложнее задача, попробую использовать Redis. Спасибо большое.