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