Уведомления

Группа в Telegram: @pythonsu

#1 Май 28, 2012 12:23:35

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

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

можно ли получить ключ по значению в словаре? может есть какая то стандартная функция?

{u'':u'',u'Gorod':u'1',…..}

как получить Gorod, зная значение

спасибо

Офлайн

#2 Май 28, 2012 12:39:31

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

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

Возможно, стоит подумать над изменением логики работы программы. Ну или созданием второго словаря, если операция критична по времени.

for key, value in dict.iteritems():
        if value == needle:
                print key



Офлайн

#3 Май 28, 2012 12:44:13

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

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

просто я думал может есть стандартные методы.

примерно так я тоже реализовал, переводил в список и смотрел по второму значнию.

спасибо.

сделаю второй словарь наоборот :)

Офлайн

#4 Май 28, 2012 12:45:42

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

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

а ещё тогда второй вопрос. нет ли стандартной функци для получения обратного словаря?

ну чтобы опять что-то не ищобретать.

через цикл то сделать смогу, вот так

dic_contacts_reverse={}
for i in dic_contacts:
	dic_contacts_reverse[dic_contacts[i]]=i

Отредактировано ilnur (Май 28, 2012 12:47:38)

Офлайн

#5 Май 28, 2012 12:55:26

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

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

Если все значения в словаре хешируемы, тогда:

>>> d = { 1: (1,2), 2: 3, 4: 'aaa', '5': 6 }
>>> rd = dict(map(lambda x: x[::-1], d.iteritems()))
>>> d
{1: (1, 2), 2: 3, '5': 6, 4: 'aaa'}
>>> rd
{(1, 2): 1, 3: 2, 'aaa': 4, 6: '5'}

Или попроще:
{ v: k for k,v in d.iteritems() }

Стандартной функции не встречал.



Отредактировано fata1ex (Май 28, 2012 12:57:54)

Офлайн

#6 Май 28, 2012 13:46:15

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

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

>>>>а ещё тогда второй вопрос. нет ли стандартной функци для получения обратного словаря?
Предположим, у Вас есть словарь

d={ 1:2 , 2:2, 3:'a', 4:'a'}
Какие значения вы хотите получить в обратном словаре?
Такие?
d={ 2:2, 'a':3}
Или такие?
d={ 2:1, 'a':4}
Или, вероятно, такие?
d={ 2:1, 'a':3}
А вот не угадаете, что там получится, ибо словарь не сортируется!
Посему идея не очень хороша.



Отредактировано FishHook (Май 28, 2012 13:47:07)

Офлайн

#7 Май 28, 2012 15:14:18

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

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

Непонятно, что делать с дублирующимися значениями. Или тогда делать двухмерный список, или брать только один из дубликатов, или брать все в список.



Офлайн

#8 Май 28, 2012 15:40:58

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

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

asilyator, как бы об этом уже написал FishHook.

Дублирующие значения можно хранить в ключе-кортеже, что может усугубить доступ к значению в новом словаре до O(n), так как потребуется перебор всех ключей, если ключ не найдётся в словаре сам по себе. В любом случае использовать структуры данных надо с умом, понимая, зачем и когда они нужны. Поддерживать актуальными два словаря тоже не самое приятное занятие, поэтому лучше подумать о другой структуре данных или об абстрагировании реализации через свой класс.



Отредактировано fata1ex (Май 28, 2012 15:41:51)

Офлайн

#9 Май 28, 2012 22:07:26

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

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

fata1ex
asilyator, как бы об этом уже написал FishHook.
Я описал все возможные решения.



Офлайн

#10 Май 29, 2012 05:46:14

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

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

Кстати, кроме дубликатов, значение может быть и нехешируемым, например, список



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version