Уведомления

Группа в Telegram: @pythonsu

#1 Май 29, 2012 05:50:17

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

получить ключ по значению в словаре

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'}
Очевидно же, что Ваша программа написана концептуально неправильно.



Офлайн

#2 Май 29, 2012 06:54:36

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

получить ключ по значению в словаре

спасибо. этого я не учел.
буду искать другие пути решения задачи

Офлайн

#3 Май 29, 2012 13:37:04

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

получить ключ по значению в словаре

Честно попробовал написать 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version