Форум сайта python.su
568
asilyatorfata1exЯ описал все возможные решения.
asilyator, как бы об этом уже написал FishHook.
asilyatorОбъясните, как вы хотите получить Gorod в случае такого словаря?
{u'':u'',u'Gorod':u'1',…..}
как получить Gorod, зная значение
{u'':u'', u'Gorod':u'1', 'Gorod':u'2', 'Selo':u'1', 'Selo':u'2'}
Офлайн
22
спасибо. этого я не учел.
буду искать другие пути решения задачи
Офлайн
52
Честно попробовал написать ReversedDict. Получилось, что структура (как и ожидалось) не оправдывает своего использования. При вставке нового ключа приходится проверять все существующие ключи и ключи-кортежи из-за подобных словарей { 1: 2, 3: (4,2) }. В таком случае приходится перехешировать значения дублирующихся ключей { 2: (1,3), 4: 3 }. Так же непонятно, что мы ходим сделать операцией d(2) - заменить или вставить новое значение. Короче, бредятина :)
При удалении, проверке на вхождение и при доступе к значению получается тоже самое. В общем, реализовать ReversedDict можно (переписав getitem, setitem, getattr, contains, str и тд от стандартного dict), но полученную радость лучше спрятать от людских глаз.
Насчет хеширования нехешируемых объектов проблем немного. Использование isinstance(value, collections.Hashable), рекурсия и возможности питона превращать всё движущееся в кортеж решает вопрос довольно просто.
Отредактировано fata1ex (Май 29, 2012 18:04:14)
Офлайн