Как найти ключ в словаре питон
Перейти к содержимому

Как найти ключ в словаре питон

  • автор:

Получить ключ по значению

Если элемент строки есть среди значений словаря, необходимо вывести соответствующий значению ключ. Если среди ключей — то вывести значение по ключу значение. Вывести необходимо в две строки, значения отдельно от ключей. Т.е. для строки ‘a3a2c’ ожидаемый вывод ‘113’ и ‘cb’ Как вывести значения по ключу, я разобрался:

for i in stroka: if i in d.keys(): print(d[i], end='') 

А вот вывести ключ по значению у меня не получается:

for j in stroka: if j in d.values(): print(. end='') 

Отслеживать
49.3k 17 17 золотых знаков 57 57 серебряных знаков 101 101 бронзовый знак
задан 28 мар 2016 в 7:41
Sergey Mokhin Sergey Mokhin
373 3 3 золотых знака 5 5 серебряных знаков 12 12 бронзовых знаков

9 ответов 9

Сортировка: Сброс на вариант по умолчанию

d = < 1: '1', '2': 2, 3: '3', >def get_key(d, value): for k, v in d.items(): if v == value: return k print(get_key(d, '1')) print(get_key(d, 2)) print(get_key(d, 42)) 
1 2 None 

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

Отслеживать
ответ дан 28 мар 2016 в 7:47
77.2k 6 6 золотых знаков 58 58 серебряных знаков 126 126 бронзовых знаков

Можно инвертировать словарь inv_d = и еще раз вывести значение по ключу. Но может есть еще способ? Что-то можно подставить в print в моем случае?

28 мар 2016 в 8:12

Функцию get_key, например. Или используя инвертированный словарь: for k in inv_d: print(inv_d[k]) . Тут у нас в k будет значение оригинального словаря и соответственно, мы будем получать и выводить ключи по значениям

28 мар 2016 в 8:47

Т.е. для строки ‘a3a2c’ ожидаемый вывод ‘113’ и ‘cb’

Если есть словарь d и коллекция ключей keys , то чтобы получить соответствующие значения, используя default значения для отсутствующих ключей:

def get_values(d, keys, default=None): return (d.get(k, default) for k in keys) 
d = s = 'a3a2c' print(''.join(get_values(d, s, ''))) # -> 113 inv_d = dict(zip(d.values(), d.keys())) print(''.join(get_values(inv_d, s, ''))) # -> cb 

Если хочется сразу отфильтровать отсутствующие ключи:

def get_existing_values(d, keys): return filter(None, map(d.get, keys)) 
>>> ''.join(get_existing_values(inv_d, s)) 'cb' 

Отслеживать
ответ дан 28 мар 2016 в 14:57
52.4k 11 11 золотых знаков 110 110 серебряных знаков 312 312 бронзовых знаков

for key in a: print ("%s -> %s" % (key, a[key])) #python3 

Отслеживать
ответ дан 6 сен 2017 в 19:19
21 1 1 бронзовый знак

d=dict(a='1',b='2',c='3') # первый словарь print(d) stroka = 'a3a2c' print('stroka=',stroka) for m in stroka: #поиск элементов из stroka в ключах d if m in d.keys(): #вывод значений этих лючей print('буква ', m, 'из строки "stroka" является ключом значения ', d[m]) s=[] for i in d.keys(): #второй s.append((d[i],i)) #словарь b=dict(s) #является обратным для первого #значения являются ключами, а ключи значениями stroka_=stroka for i in stroka_: #поиск элементов из stroka в значениях d if i in b.keys(): #вывод ключей этих значений print('цифра ', i, 'из строки "stroka" является значением ключа', b[i]) 

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

Поиск ключа по значению в словаре в Python

Обложка к статье

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

Мы представим вам несколько эффективных и удобных способов поиска ключа в словаре, позволяющих решить эту задачу с помощью различных подходов. Мы рассмотрим использование понимания списка, метода list.index() , метода dict.items() , лямбда-выражений с функцией filter() и модуля re для работы с регулярными выражениями.

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

Поиск ключа по значению, используя понимание списка

При работе со словарями в Python может возникнуть необходимость найти ключи, соответствующие определенному значению. В таких случаях можно использовать понимание списка для эффективного поиска. Давайте рассмотрим пример с оценками студентов:

students = < "Alice": "A", "Bob": "B", "Charlie": "C", "Dave": "B", "Eve": "A" >target_grade = "B" keys = [key for key in students if students[key] == target_grade] print("Keys with target grade:", keys)

В этом примере у нас есть словарь students , в котором ключами являются имена студентов, а значениями — их оценки. Наша цель — найти все ключи (имена студентов), у которых оценка равна target_grade (B).

Мы используем понимание списка, создавая список keys . Мы перебираем ключи key в словаре students и проверяем, равно ли значение оценки students[key] целевой оценке target_grade . Если условие выполняется, мы добавляем соответствующий ключ key в список.

В результате выполнения кода мы получим следующий вывод:

Keys with target grade: ['Bob', 'Dave']

Таким образом, мы нашли ключи (имена студентов) с оценкой, равной «B», используя понимание списка. Этот подход позволяет эффективно находить ключи по заданному значению в словаре.

Поиск ключа по значению с помощью list.index()

В Python существуют различные способы поиска ключа по значению в словаре. Один из таких способов — использование метода list.index() в сочетании с преобразованием словаря в список.

Давайте рассмотрим пример, где мы ищем ключ по заданному значению в словаре с оценками студентов:

students = < "Alice": "A", "Bob": "B", "Charlie": "C", "Dave": "B", "Eve": "A" >target_grade = "B" keys = list(students.keys()) index = list(students.values()).index(target_grade) key = keys[index] print("Key with target grade:", key)

этом примере мы начинаем с создания списка keys , содержащего все ключи из словаря students . Затем мы используем метод list.index() для поиска индекса первого вхождения значения target_grade в списке значений словаря. После получения индекса мы можем получить соответствующий ключ из списка keys .

При выполнении кода мы получим следующий вывод:

Key with target grade: Bob

Таким образом, мы нашли ключ (имя студента) с оценкой «B», используя метод list.index() в сочетании с преобразованием словаря в список. Этот метод предоставляет удобный способ получить ключ, соответствующий заданному значению в словаре.

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

Поиск ключа по значению с помощью dict.item()

В Python для поиска ключа по значению в словаре мы можем использовать метод dict.items() . Этот метод возвращает представление словаря в виде списка кортежей, каждый из которых содержит ключ и значение.

Рассмотрим пример, где мы ищем все ключи, соответствующие заданному значению в словаре с оценками студентов:

students = < "Alice": "A", "Bob": "B", "Charlie": "C", "Dave": "B", "Eve": "A" >target_grade = "B" keys = [key for key, value in students.items() if value == target_grade] print("Keys with target grade:", keys)

В данном примере мы используем генератор списка для прохода по каждому элементу из students.items() . Здесь students.items() возвращает список кортежей, содержащих пары ключ-значение. Затем мы проверяем, соответствует ли значение заданному target_grade и добавляем ключ в список keys .

При выполнении кода мы получим следующий вывод:

Keys with target grade: ['Bob', 'Dave']

Таким образом, мы нашли все ключи (имена студентов), у которых оценка равна «B», используя метод dict.items() . Этот метод предоставляет удобный способ получить доступ к парам ключ-значение в словаре и выполнить поиск ключа по значению.

Поиск ключа по значению с помощью лямбда-выражения и filter()

В Python для поиска ключа по значению в словаре мы можем использовать комбинацию лямбда-выражения и функции filter() . Функция filter() позволяет нам отфильтровать элементы из последовательности, основываясь на заданном условии.

Рассмотрим пример, где мы ищем ключи, соответствующие заданному значению в словаре с оценками студентов:

students = < "Alice": "A", "Bob": "B", "Charlie": "C", "Dave": "B", "Eve": "A" >target_grade = "B" keys = list(filter(lambda key: students[key] == target_grade, students)) print("Keys with target grade:", keys)

В данном примере мы создаем лямбда-выражение, которое проверяет соответствие значения по ключу в словаре students заданному target_grade . Затем мы используем функцию filter() для применения этого лямбда-выражения к каждому ключу в словаре. Результатом будет отфильтрованный итератор, который мы преобразуем в список с помощью list() .

При выполнении кода мы получим следующий вывод:

Keys with target grade: ['Bob', 'Dave']

Таким образом, мы нашли все ключи (имена студентов), у которых оценка равна «B», используя лямбда-выражение и функцию filter() . Этот подход предоставляет более компактный способ поиска ключей по значению в словаре.

Поиск ключа по значению с помощью модуля re

Следующий метод использует модуль re для поиска ключа по значению в словаре:

import re # Заданный входной словарь с оценками студентов students = < "Alice": "A", "Bob": "B", "Charlie": "A+", "David": "B+", "Eve": "C" ># Значение для поиска value = "B" # Создание регулярного выражения для точного совпадения значения pattern = re.compile(r'\b' + re.escape(value) + r'\b') # Поиск ключа по значению с использованием модуля re key = next((k for k, v in students.items() if pattern.search(v)), None) # Вывод результата if key: print("Ключ по значению", value, "найден:", key) else: print("Ключ по значению", value, "не найден")

В приведенном коде мы начинаем с определения входного словаря students , который содержит оценки студентов. Затем мы выбираем значение, которое мы хотим найти, и сохраняем его в переменную value . Например, мы можем искать студента с оценкой «B».

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

Затем мы используем генератор списка и функцию next() для прохода по парам ключ-значение в словаре students . Мы применяем функцию pattern.search() к значению и проверяем, соответствует ли значение регулярному выражению. Если найдено первое соответствие, мы прекращаем поиск и сохраняем ключ в переменную key . Если нет соответствия или словарь пустой, переменная key будет иметь значение None .

В конце мы проверяем значение переменной key . Если значение не равно None , это означает, что ключ по указанному значению был найден, и мы выводим сообщение о том, что ключ найден, и выводим сам ключ. В противном случае, если значение key равно None , это означает, что ключ по указанному значению не был найден, и мы выводим сообщение о том, что ключ не найден.

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

Как в python вернуть ключ словаря по его значению словаря?

Таким макаром я могу получить ключ, но как получить значение по ключу?

Если я делаю так

for smbl in s3: if smbl in d.values: print(d[smbl], end='')

То получаю KeyError

  • Вопрос задан более трёх лет назад
  • 32699 просмотров

1 комментарий

Простой 1 комментарий

adugin

Andrey Dugin @adugin Куратор тега Python

Сформулируйте вопрос нормально. Кстати, следующие две конструкции эквивалентны, первая предпочтительна:
if key in d:
if key in d.keys():

Как взять значение из словаря Python и не сломать приложение?

Словари ломают мозг новичкам в программировании. Проблема в основном кроется в индексации: если в привычных списках каждый элемент имеет свой порядковый номер, то в словарях этим номером является произвольное (за некоторыми ограничениями) значение. Словари используются в любых крупных приложениях, и вам нужно обязательно знать основные методы, которые Python предоставляет для словаря: как его быстро создать, как создается копия словаря, как устанавливать в него значения и как из их словаря брать. Ниже мы рассмотрим два последних вопроса – как создавать новые пары и как безопасно брать их, используя встроенную функцию dict.

Значение словарей для языка программирования Python
Способ первый, плохой: прямое обращение
Способ второй, хороший: методом get
Способ третий, альтернативный: методом setdefault
Немного о списочных выражениях
Что почитать

Значение словарей для языка программирования Python

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

В процессе программирования словари используются практически повсеместно и для решения самых разных задач. Для их индексирования используются ключи, каждый из которых имеет определенное значение. Именно такой подход к разработке ПО обеспечивает простоту и лаконичность программного кода, созданного с помощью Python. Стоит ли удивляться тому вниманию, которое уделяется изучению словарей в целом и конкретному поиску определенного ключа/значения в словаре. Причем задачу требуется решить таким образом, чтобы полученный результат не привел к неисправности или сбоям в работе программы.

Способ первый, плохой: прямое обращение

Для этого и двух последующих способов мы будем использовать тестовый код, который вы сами можете запустить и посмотреть на результат. Первые 3 строки кода – инициализация – всегда будут одинаковыми. Вот они:

list_of_customers = ["Anna", "Ivan", "Peter"] discount_amount = 5 customers_dictionary =

Если вы не понимаете, что здесь происходит – смотрите раздел «Немного о списочных выражениях». В первой строке мы создаем список клиентов, во второй кладем в переменную базовую скидку для этих клиентов (5%), в третьей создаем словарь с парами . Если мы вызовем

print(customers_dictionary)

то увидим следующее:

Если нам нужно узнать, какая скидка у клиента, мы можем написать

print(customers_dictionary["Anna"])

и в консоли появится число 5 – значение ключа “Anna”. Только вот если мы обратимся к любому несуществующему ключу (например, случайно напишем “Annna”), то Python 3 прервет исполнение и выбросит исключение. Программа будет принудительно закрыта процессором, и это точно не то, чего вам хотелось бы. Эту проблему можно обойти через обработку исключений, но для серьезного программирования Python такой выход не подходит – сложно, ненадежно. Python предоставляет куда более удобные методы взятия (и установки при необходимости) значения: методы .get() и .setdefault().

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

Чтобы нивелировать такой существенный минус, используются два метода. Первый предусматривает задействование конструкции try/except, которая предназначена для замены сообщения об ошибке на что-то более приятное, например, «Такой ключ отсутствует». В этом случае программный код имеет следующий вид.

try: author['age'] except KeyError: print('Такого ключа нет') >>> 'Такого ключа нет'

Второй метод предполагает использованием встроенной библиотеки под названием collections или, что будет правильнее, готовой структуры из нее в виде defaultdict. Она представляет собой расширение к стандартным словарям, которое способно давать значение по умолчанию в случае запроса несуществующего ключа.

Способ второй, хороший: методом get

У словарей есть встроенные методы. Вам не нужно подключать дополнительные библиотеки, чтобы пользоваться ими – все уже подключено. Единственное, что вам нужно сделать – это создать словарь, после чего обратиться к его методу по стандартной форме:

some_dict.method_name(arguments)

Для того, чтобы использовать метод get() в примере выше, вам нужно написать:

print(customers_dictionary.get("Anna"))

Print можно и не писать, но тогда метод вернет значение в никуда, и оно просто исчезнет, а с помощью принта мы можем посмотреть результат. Приведенная выше строка кода выводит число «5».

А что будет, если мы с помощью этого метода обратимся к элементу, которого в словаре нет? Например, исполним следующий код:

print(customers_dictionary.get("Oleg"))

С этом случае .get() возвращает None. Причем он вернет None как отдельный объект – еще в ранних версиях Python для None и Void добавили отдельный тип объекта. По умолчанию None возвращается, когда искомый ключ не найден, но вы можете переопределить этот возврат, для чего у .get() есть второй, необязательный параметр. Если вы напишете:

print(customers_dictionary.get("Oleg", "Не найдено"))

то ответом будет строка «Не найдено», так как метод не смог найти указанный вами ключ. Если же вы укажете в качестве первого аргумента «Anna», а в качестве второго «Не найдено», то метод вернет число 5.

Метод .get() ничего не меняет в словаре – он только возвращает какое-то значение. Запомните, это будет важно дальше.

Способ третий, альтернативный: методом setdefault

Есть еще один метод, возвращающий значение из словаря – .setdefault(). Он имеет 2 обязательных аргумента: какой ключ искать и что записывать в словарь, есть ключ не найден. Результата у исполнения этого метода может быть 2:

  1. Ключ, указанный вами, найден. В этом случае .setdefault() просто возвращает значение ключа.
  2. Ключ, указанный вами, не найден. В этом случае .setdefault() создает новый ключ (первый аргумент функции) и присваивает ему указанное значение (второй аргумент функции).

Другими словами, метод .setdefault() обладает следующим и весьма обширным функционалом, который включает:

  • самостоятельное создание ключа;
  • создание еще одного значения, дополняющего ключ, заданное программистом (нередко используется опция по умолчанию, например, None);
  • добавление указанной пары в существующий словарь;
  • возврат значения, в зависимости от результатов поиска основного ключа.

Если мы исполним код:

print(customers_dictionary.setdefault("Anna", 10))

на экран будет выведено число «5», поскольку в словаре нашелся ключ «Anna» (и второй аргумент не был задействован). Если же мы исполним код:

print(customers_dictionary.setdefault("Oleg", 10))

то на экран будет выведено «10»: метод увидит, что ключа «Oleg» нет, после чего создаст его и в качестве значения укажет 10. Таким образом, .setdefault() обновляет словарь.

Зачем нужно иметь 2 разных метода? Потому что это удобно. Например, у вас есть словарь клиентов, и вам нужно проверить скидку одного конкретного клиента. Вы пишете запрос:

print(customers_dictionary.get("Annna", "Не найдено"))

Как видите, вы случайно допустили ошибку. Что будет, если вы используете .setdefault()? Создастся новый клиент Annna, и у этого клиента в скидке будет лежать строка «Не найдено». Это – очень плохо, потому что если у вас есть метод, перебирающий все ключи словаря и что-то делающий с числовыми значениями этих ключей, строка «Не найдено» вам все сломает.

А теперь предположим, что вы регистрируете нового клиента, которому нужно выдать скидку. Проблема в том, что клиент не помнит, регистрировался ли у вас раньше. Вы, конечно, можете методом .get() попытаться поискать его в базе, если клиент не будет найден – создать нового и назначить ему скидку. Но это – 3 строки кода. Зачем писать 3 строки кода, если можно уместить все в одну?

print(customers_dictionary.setdefault("Oleg", 5))

Если клиент будет найден, вам просто вернется величина его скидки – можете ни к чему ее не присваивать, и результат будет отброшен. А если клиента не было – он создастся со скидкой в 5%. И вам ничего не нужно проверять.

Немного о списочных выражениях

На всякий случай расскажем вам про пару фишек при работе со словарями, которые пригодятся вам в повседневной жизни. Одна из самых полезных – это списочные выражения, выше мы использовали один из них. У каждого iterable-объекта (того, элементы которого можно пересчитать) в Python есть списочное выражение (list comprehension). Если вас сбивает с точку слово «список» в названии, то поясняем – списочные выражения могут применяться не только к спискам, но списки эту фишку получили первыми, поэтому название и закрепилось. Создать словарь или другой перечисляемый объект в этом случае можно одной строкой кода, при этом можно тонко «настроить» его генерацию. Списочное выражение устроено следующим образом:

variable =
  • variable – переменная, к которой будет привязан словарь;
  • key – ключ;
  • value – значение;
  • iterable – любой перечисляемый объект;
  • something – какое-то условие.

Последняя часть, «if something», не обязательна, остальные должны присутствовать. Работает все следующим образом:

  1. Запускается цикл for, в котором перебираются все iterable.
  2. Значение текущей итерации записывается в переменную key.
  3. Если условие if something – верное, то в словарь записывается пара key: value.
  4. Повторяется, пока есть что перебирать в цикле.
  5. Готовый словарь присваивается переменной.

Это может показаться сложным, но списочные выражения позволяют создавать большие и сложные словари в одну строку. Например, у вас есть словарь all_customers, в котором ключами указаны имена клиентов, а значениями – процент скидки. Вам нужно на основе этого словаря создать новый, customers_goe_10, в котором будут храниться все клиенты, у которых 10% скидки или больше (goe = greater or equal). Если вы не хотите перебирать ключи в цикле, можно сделать так:

customers_goe_10 = = 10>

Что за магия только что произошла? Все просто: у любого словаря есть ряд методов items (методы keys, values и непосредственно items). Когда вы обращаетесь к .items(), то получаете все значения в виде кортежа, то есть превращается в (“Anna”, 5). Каждая такая пара записывается в переменную item, значения можно получать по индексам: item[0] соответствует ключу (“Anna”), item[1] соответствует значению (5). Затем в новом словаре создается пара ключ: значение (item[0]: item[1]) при условии, что значение больше или равно 10 (if item[1] >= 10). Это повторяется для каждой пары из all_customers.

Что почитать

  • Хороший бесплатный курс от W3Schools: https://www.w3schools.com/python/python_dictionaries.asp.
  • Документация Python о структурах данных: https://docs.python.org/3/tutorial/datastructures.html.
  • Детальные разъяснения на Stack Overflow: https://stackoverflow.com/questions/15555673/python-dict-setdefault-confused.

Вывод

Вкратце:

  • Узнать значение по ключу в словаре Python 3 можно через прямое обращение, через метод .get() и через метод .setdefault().
  • Получение значение через прямое обращение к ключу – очень опасный метод, потому что если ключа в словаре не обнаружится, то программа выкинет исключение, и процессор принудительно завершит программу.
  • Метод .get() возвращает значение ключа и имеет 2 аргумента: ключ (обязательно) и дефолтное значение (необязательно). Если ключ есть – вернется значение. Если ключа нет – вернется дефолтное значение (если указано) или объект None. .get() не меняет словарь.
  • Метод .setdefault() возвращает значение ключа, если нашел его в словаре, и создает новый ключ + устанавливает ему указанное значение, если ключа не нашлось. Имеет 2 обязательных аргумента – ключ и значение. Меняет словарь.
  • Если вам нужно просто проверить наличие ключа и получить значение – используйте .get(). Если вам нужно получить значение в любом случае, даже если для этого нужно создать ключ – используйте .setdefault().

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *