Возврат ключа значения, найденного в словаре, с использованием «значения в dict.values ​​()»

Есть ли способ вернуть ключ для совпадения, найденного в словаре, используя:

if val in dict.values():
# print the key of the value in the dictionary that matches val

Я пытаюсь использовать одну и ту же функцию поиска при поиске трех разных типов значений. Один — буквенно-цифровой, другой — строка, а третий — число. В функции поиска я вызываю приведенный выше код. В этой функции я просматриваю словарь, содержащий известные наборы этих значений (три идут вместе), пытаясь сопоставить отдельные значения, считанные из файла, с этими известными наборами в словаре. У меня есть порядок поиска (буквенно-цифровой, строковый, числовой). Буквенно-цифровые и числовые записи являются один к одному, но строковая запись в известном словаре представляет собой список. Я предполагал, что dict.iteritems() не будет искать в списке строк неизвестную строку, а val in dict.values() будет. Таким образом, использование последнего.

В зависимости от того, какие совпадения (буквенно-цифровые не совпадают, но числовые и т. д.) я хотел вернуть ключ, чтобы узнать, как входящие данные сопоставляются с известным набором.

Поэтому вместо того, чтобы писать две или три отдельные функции для каждого типа клавиш, я пытался использовать хитрый код словаря, чтобы сохранить их до одной.

Изменить:

Итак, предположим, у меня есть этот словарь:

dict = {'alphaNumeric':'A7', 'number':'36', 'string':['red','green','blue']}

и эти неполные наборы значений для поиска по нему:

sets = [['A7','',''],[['','36',''], ['','','green']]

Я пытался разработать функцию для обработки любого поиска:

def searchFun(sets, dict):
    for set in sets:
        for val in sets:
            if val in dict.values():
                return val, #KEY WHERE IT WAS FOUND#

person traggatmot    schedule 22.11.2015    source источник
comment
Нет никакой гарантии, что ключ существует, поскольку несколько ключей могут иметь одно и то же значение. Что вы хотите, чтобы произошло в этом случае?   -  person BrenBarn    schedule 22.11.2015
comment
Возможный дубликат Как можете ли вы напечатать ключ с заданным значением в словаре для Python?   -  person Avihoo Mamka    schedule 22.11.2015
comment
Мой словарь и более крупные функции настроены так, что дубликаты исключены. Если значение найдено, оно будет связано только с одним ключом.   -  person traggatmot    schedule 22.11.2015
comment
Возможный дубликат Поиск ключа из значения в словаре Python:   -  person Casimir Crystal    schedule 22.11.2015
comment
Имейте в виду, что использование значения для поиска ключа противоположно тому, как должны работать словари. Вероятно, у вас возникла проблема XY.   -  person TigerhawkT3    schedule 22.11.2015
comment
это все еще выглядит так после моих правок? Мне кажется, что может и не быть.   -  person traggatmot    schedule 22.11.2015
comment
Да, до сих пор так выглядит.   -  person TigerhawkT3    schedule 22.11.2015


Ответы (4)


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

my_dict = {'A7':'alphaNumeric', '36':'number', 'red':'string', 'green':'string', 'blue':'string'}
my_queries = ['A7', '', '', '', '36', '', '', '', 'green']

Обратите внимание, что ваш список запросов, являющийся нерегулярным многомерным list, должен быть сглажен (для этого есть хороший метод в лучший ответ на этот вопрос — при необходимости вы можете настроить его в соответствии с вашей версией Python). Я жестко запрограммировал его как плоское list, чтобы продемонстрировать функцию поиска.

Теперь вы можете использовать чистую, лаконичную функцию:

def searchfun(d, queries):
    return [(key,d[key]) for key in queries if key in d]

Со следующим результатом:

>>> searchfun(my_dict, my_queries)
[('A7', 'alphaNumeric'), ('36', 'number'), ('green', 'string')]

Также обратите внимание, что это похоже на ООП, где у каждого объекта есть атрибут, который можно назвать чем-то вроде self.classification.

person TigerhawkT3    schedule 22.11.2015
comment
Ух ты. Это действительно интересно. Если я использую их в обратном порядке, много ли других? Может показаться, что следует атрибут: значение, а не значение: атрибут. Например, этот сайт: tutorialspoint.com/python/python_dictionary.htm имеет атрибут : предложенное значение. И мне кажется, что я кажусь многим другим таким же. - person traggatmot; 22.11.2015
comment
@traggatmot - вам придется оценивать это в каждом конкретном случае, но в целом вам следует подумать, какая информация у вас есть и какая информация вам нужна, а затем перейти в этом направлении. Ищете определенный атрибут для набора значений/объектов? value:attribute. Нахождение всех значений, имеющих определенный атрибут? attribute:[value1, value2]. - person TigerhawkT3; 22.11.2015

Словари оптимизированы для поиска ключей. Нет хорошего способа поиска по значению. Вам просто нужно повторить это.

for k, v in dict.iteritems():
    if val == v:
        print k
person Laizer    schedule 22.11.2015
comment
Списки сравниваются как True только в том случае, если они расположены в одном порядке. Если вам нужно сравнить списки, которые могут быть в разном порядке, вы можете использовать set(val) == set(v). Подсказка: это устранит любые дубликаты в сравнении. - person Laizer; 22.11.2015

Нет, нет. Как предлагает @Laizer, вы можете использовать .iteritems (или .items() в python3. Но вы не можете сделать это с .values(). Однако вы можете вернуть один из ключей с этим значением:

if val in dict.values():
    for k in dict.keys(): # of just `for x in dict:`
        if val == dict[k]:
             print k
person NotAnAmbiTurner    schedule 22.11.2015
comment
Как это может измениться, если одним из значений является список строк? - person traggatmot; 22.11.2015
comment
Это вообще не должно меняться, пока списки совпадают, они совпадают. - person NotAnAmbiTurner; 22.11.2015
comment
Ты не понимаешь. Извините за мое плохое объяснение. если у меня есть неизвестная строка, которая читается, я сравниваю ее с частью словаря (строковой частью), в которой значение представляет собой список - это не сравнение списка со списком, а попытка увидеть, является ли строка (если это считанные данные) находится в списке. - person traggatmot; 22.11.2015

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

mydict = {'orange': 0, 'red': 1, 'yellow': 2, 'black': 0}
print mydict.keys()[mydict.values().index(0)]

Это вернет вам первое вхождение значения 0 ключа, которое равно 'orange'

person Ansh J    schedule 22.11.2015