Я сделал функцию, которая будет искать возраст в a Dictionary
и показывать подходящее имя:
dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
for age in dictionary.values():
if age == search_age:
name = dictionary[age]
print name
Я знаю, как сравнить и найти возраст, я просто не знаю, как показать имя человека. Кроме того, я получаю KeyError
из-за строки 5. Я знаю, что это не правильно, но я не могу понять, как заставить его искать в обратном направлении.
python
dictionary
user998316
источник
источник
Ответы:
Здесь ничего нет.
dict
не предназначен для использования таким образом.источник
Python 3.x
list.items()
вместоlist.iteritems()
должен быть использованdict
может быть для нескольких вещей в разное время; ключи и значения имеют четкое значение, конечно, но «dict
элементы с данным значением» - вполне разумный запрос. Рекомендация использовать список пар не учитывает контекст, согласно которому один элемент является « определением » другого, например, в списках параметров ...Или в Python 3.x:
По сути, он разделяет значения словаря в списке, находит позицию имеющегося у вас значения и получает ключ в этой позиции.
Подробнее о
keys()
и.values()
в Python 3: Как я могу получить список значений из Dict?источник
list.keys()
иlist.values()
функции генерируют элементы в том же порядке?index
метода.Если вам нужно и имя, и возраст, вы должны использовать,
.items()
который дает вам ключевые(key, value)
кортежи:Вы можете распаковать кортеж в две отдельные переменные прямо в
for
цикле, а затем сопоставить возраст.Вам также следует рассмотреть вопрос об изменении словаря, если вы, как правило, будете искать по возрасту, и нет двух людей одного возраста:
так что вы можете найти имя для возраста, просто делая
Я назвал его
mydict
вместо,list
потому чтоlist
это имя встроенного типа, и вы не должны использовать это имя для чего-либо еще.Вы даже можете получить список всех людей данного возраста в одной строке:
или если в каждом возрасте есть только один человек:
который просто даст вам,
None
если нет никого с таким возрастом.Наконец, если
dict
он длинный, и вы работаете на Python 2, вам следует подумать об использовании.iteritems()
вместо того,.items()
как это сделал Cat Plus Plus в своем ответе, поскольку для этого не нужно делать копию списка.источник
dict
список пар.dict
имеет смысл.value --> key
илиkey --> value
Я подумал, что было бы интересно указать, какие методы являются самыми быстрыми и в каком сценарии:
Вот несколько тестов, которые я провел (на MacBook Pro 2012 года)
Результаты
profile.run()
по каждому методу 100000 раз:Способ 1:
Способ 2:
Способ 3:
Таким образом, это показывает, что для небольшого требования метод 1 является самым быстрым. Это наиболее вероятно, потому что он возвращает первое совпадение, в отличие от всех совпадений, таких как метод 2 (см. Примечание ниже).
Интересно, что, выполняя те же самые тесты на моем дикте с 2700 записями, я получаю совершенно разные результаты (на этот раз - 10000 раз):
Способ 1:
Способ 2:
Способ 3:
Итак, метод 3 намного быстрее. Показывает, что размер вашего выбора влияет на то, какой метод вы выберете.
Примечания: Метод 2 возвращает список всех имен, тогда как методы 1 и 3 возвращают только первое совпадение. Я не рассматривал использование памяти. Я не уверен, что метод 3 создает 2 дополнительных списка (keys () и values ()) и сохраняет их в памяти.
источник
.keys()
`.values()
возвращают словарные представления, которые являются легковесными.однострочная версия: (i - старый словарь, p - обратный словарь)
объяснение:
i.keys()
иi.values()
возвращает два списка с ключами и значениями словаря соответственно. Функция zip имеет возможность связывать списки для создания словаря.Предупреждение: это будет работать только в том случае, если значения являются хэшируемыми и уникальными.
источник
или лучше
источник
источник
lKey = [k for k, v in lDictionary.iteritems() if v == lValue][0] or 'else-key'
Попробуйте эту однострочную, чтобы перевернуть словарь:
источник
Я нашел этот ответ очень эффективным, но не очень легко читаемым для меня.
Чтобы сделать это более понятным, вы можете инвертировать ключ и значение словаря. Это сделать ключи значений и значения ключей, как показано здесь .
или
что по сути то же самое, что этот другой ответ .
источник
Если вы хотите найти ключ по значению, вы можете использовать словарь для создания словаря поиска, а затем использовать его, чтобы найти ключ по значению.
источник
Вы можете получить ключ, используя
dict.keys()
,dict.values()
иlist.index()
методы, см примеры кода ниже:источник
search_age
var в следующей строке ... Может быть, вам следует заменитьvalue
наsearch_age
?type(dict_values)
было бы полезно распечатать )?Вот мой взгляд на эту проблему. :) Я только начал изучать Python, поэтому я называю это:
Решение «Понятно для начинающих».
,
,
источник
источник
is
следует использовать только для проверки равенства синглетонов (None
,True
иFalse
т. Д.). Тот факт, что CPython повторно использует строковые литералы (и, следовательно,a = 'foobar'; a is 'foobar'
естьTrue
), является деталью реализации и на него не следует полагаться.get_key
будет выбрасывать,StopIteration
если значение не существует в словаре - было бы лучше использовать тот,next(..., None)
который будет возвращаться,None
если значение не найдено.get_first_key = lambda v, d: next((k for k in d if (v in d[k] is not None)), None)
Подумайте об использовании панд. Как говорится в «Питоне для анализа данных» Уильяма МакКинни
Для запроса вашей серии сделайте следующее:
Что дает:
Если вам нужно сделать что-то еще с выводом, преобразование ответа в список может быть полезным:
источник
Здесь recovery_key принимает словарь и значение для поиска в словаре. Затем мы перебираем ключи в словаре, сравниваем их со значением и возвращаем этот ключ.
источник
мы можем получить
Key
изdict
по:источник
источник
на него ответили, но это можно сделать с помощью необычного использования «карта / уменьшение», например:
источник
Cat Plus Plus отметил, что словарь не предназначен для использования. Вот почему:
Определение словаря аналогично определению в математике. В этом случае dict - это отображение K (набора ключей) на V (значения), но не наоборот. Если вы разыменуете dict, вы ожидаете получить ровно одно возвращаемое значение. Но вполне допустимо, чтобы разные ключи отображались на одно и то же значение, например:
Когда вы ищите ключ по его соответствующему значению, вы по существу инвертируете словарь. Но отображение не обязательно обратимо! В этом примере запрос ключа, соответствующего v1, может привести к k1 или k3. Вы должны вернуть оба? Только первый найден? Вот почему indexof () не определен для словарей.
Если вы знаете свои данные, вы можете сделать это. Но API не может предположить, что произвольный словарь является обратимым, отсюда и отсутствие такой операции.
источник
вот мой взгляд на это. Это хорошо для отображения нескольких результатов на тот случай, если вам нужен один из них. Так что я добавил список, а также
И это все...
источник
Вывод следующий:
источник
Нет простого способа найти ключ в списке путем «поиска» значения. Однако, если вы знаете значение, перебирая ключи, вы можете искать значения в словаре по элементу. Если D [элемент], где D - объект словаря, равен ключу, который вы пытаетесь найти, вы можете выполнить некоторый код.
источник
Вам нужно использовать словарь и наоборот этого словаря. Это означает, что вам нужна другая структура данных. Если вы используете Python 3, используйте
enum
модуль, но если вы используете Python 2.7, используйтеenum34
который обратно портирован для Python 2.Пример:
источник
источник
Просто мой ответ в
lambda
аfilter
.источник
уже ответили, но так как несколько человек упомянули обратный словарь, вот как вы делаете это в одну строку (при условии отображения 1: 1) и некоторые различные данные перфорации:
Python 2.6:
2.7+:
если вы думаете, что это не 1: 1, вы все равно можете создать разумное обратное отображение с помощью пары строк:
насколько это медленно: медленнее, чем простой поиск, но далеко не так медленно, как вы думаете - в «прямом» словаре из 100000 записей, «быстрый» поиск (т. е. поиск значения, которое должно быть в начале ключа) был примерно в 10 раз быстрее, чем обратный просмотр всего словаря, а «медленный» поиск (ближе к концу) - в 4–5 раз быстрее. Таким образом, после примерно 10 поисков он окупается.
вторая версия (со списками на элемент) занимает примерно в 2,5 раза больше, чем простая версия.
Также были некоторые интересные результаты с ifilter. Теоретически ifilter должен быть быстрее, так как мы можем использовать itervalues () и, возможно, не нужно создавать / просматривать весь список значений. На практике результаты были ... странными ...
Таким образом, для небольших смещений это было значительно быстрее, чем в любой предыдущей версии (2.36 * u * S против минимума 1.48 * m * S для предыдущих случаев). Тем не менее, для больших смещений в конце списка, он был значительно медленнее (15,1 мс против тех же 1,48 мс). Небольшая экономия на нижнем конце не стоит затрат на верхнем, imho.
источник
[
в нем, если это так. в противном случае, убедитесь, что он в двух строках, или вставьте;
между ними, если это не так.Иногда может понадобиться int ():
источник
Вот решение, которое работает как в Python 2, так и в Python 3:
Часть before
[search_age]
создает обратный словарь (где значения являются ключами и наоборот). Вы можете создать вспомогательный метод, который будет кешировать этот обратный словарь следующим образом:или, в более общем случае, фабрика, которая создала бы метод поиска по возрасту для одного или нескольких списков.
так что вы сможете сделать:
Обратите внимание , что я переименовал
list
вages_by_name
так бывший предопределенный тип.источник
Вот как вы получаете доступ к словарю, чтобы делать то, что вы хотите:
конечно, твои имена настолько необычны, что кажется, что это будет печать эпохи, но она печатает имя. Поскольку вы обращаетесь по имени, становится понятнее, если вы напишите:
Еще лучше:
источник
Для нескольких случаев используйте:
источник
*** NameError: global name 'dictionary' is not defined
filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age , dictionary )