Я создал функцию, которая будет искать возраст в словаре
и показывать подходящее имя:
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. Я знаю, что это неправильно, но я не могу понять, как сделать поиск в обратном направлении.
mydict = {'george':16,'amber':19}
print mydict.keys()[mydict.values().index(16)] # Prints george
Или в Python 3.x:
mydict = {'george':16,'amber':19}
print(list(mydict.keys())[list(mydict.values()).index(16)]) # Prints george
По сути, он разделяет значения словаря в список, находит позицию значения, которое у вас есть, и получает ключ в этой позиции.
Подробнее о keys()
и .values()
в Python 3: https://stackoverflow.com/questions/16228248/python-simplest-way-to-get-list-of-values-from-dict.
Не существует. dict
не предназначен для использования таким образом.
for name, age in dictionary.items(): # for name, age in dictionary.iteritems(): (for Python 2.x)
if age == search_age:
print(name)
Если вам нужно и имя и возраст, вы должны использовать .items()
, который дает вам ключевые кортежи (key, value)
:
for name, age in mydict.items():
if age == search_age:
print name
Вы можете распаковать кортеж в две отдельные переменные прямо в цикле for
, а затем подобрать возраст.
Вы также можете изменить словарь на противоположный, если вы собираетесь искать по возрасту, а два человека не имеют одинакового возраста:
{16: 'george', 19: 'amber'}
поэтому вы можете найти имя по возрасту, просто сделав следующее
mydict[search_age]
Я'называю его mydict
, а не list
, потому что list
- это имя встроенного типа, и вы не должны использовать это имя для чего-либо еще.
Вы даже можете получить список всех людей с заданным возрастом в одной строке:
[name for name, age in mydict.items() if age == search_age]
или если есть только один человек с каждым возрастом:
next((name for name, age in mydict.items() if age == search_age), None)
что просто даст вам None
, если нет никого с таким возрастом.
Наконец, если dict
длинный и вы используете Python 2, вам следует рассмотреть возможность использования .iteritems()
вместо .items()
, как это сделал Кот Плюс Плюс в своем ответе, поскольку ему не нужно делать копию списка.
в Я подумал, что было бы интересно узнать, какие методы являются самым быстрым, и по какому сценарию:
Здесь's некоторые тесты я побежал (на Макбук Про 2012)
>>> def method1(list,search_age):
... for name,age in list.iteritems():
... if age == search_age:
... return name
...
>>> def method2(list,search_age):
... return [name for name,age in list.iteritems() if age == search_age]
...
>>> def method3(list,search_age):
... return list.keys()[list.values().index(search_age)]
Результаты от профиля.выполнить () по каждому методу 100000 раз:
Метод 1:
>>> profile.run("for i in range(0,100000): method1(list,16)")
200004 function calls in 1.173 seconds
Метод 2:
>>> profile.run("for i in range(0,100000): method2(list,16)")
200004 function calls in 1.222 seconds
Способ 3:
>>> profile.run("for i in range(0,100000): method3(list,16)")
400004 function calls in 2.125 seconds
Это показывает, что для небольшой дикт, метод 1-самый быстрый. Это скорее всего потому, что он возвращает первый матч, в отличие от всех игр как метод 2 (см. Примечание ниже).
Интересно, что выполняя одни и те же тесты на дикт у меня с 2700 записей, я получаю совершенно разные результаты (это время выполнения 10000 раз):
Метод 1:
>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
20004 function calls in 2.928 seconds
Метод 2:
>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
20004 function calls in 3.872 seconds
Способ 3:
>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
40004 function calls in 1.176 seconds
Так вот, Способ 3 намного быстрее. Просто идет, чтобы показать, размер вашего дикт повлияет, какой метод вы выберете.
Примечания: Способ 2 возвращает список всех имена, а методы 1 и 3 возвращает только первый матч. Я не рассматривал использование памяти. Я'м не уверен, если метод 3 создает 2 дополнительных списков (ключи() и значения()) и сохраняет их в памяти.
одна строчка версию: (я старый словарь, п-обратная словарь)
объяснение : я.ключи() и я.значения() возвращает два списка ключей и значений словаря соответственно. Функция zip имеет возможность связать воедино списки, чтобы произвести словарь.
предупреждение : это будет работать только если значения hashable и уникальным.
p = dict(zip(i.values(),i.keys()))
Попробуйте эту команду, чтобы изменить словарь:
reversed_dictionary = dict(map(reversed, dictionary.items()))
Вы можете получить ключ с помощью дикт.ключи()
, дикт.значения()
и список .индекс()
методы, см. В разделе Примеры кода ниже:
names_dict = {'george':16,'amber':19}
search_age = int(raw_input("Provide age"))
key = names_dict.keys()[names_dict.values().index(search_age)]
Я нашел это ответить очень эффективно, но не очень легко читается для меня.
Чтобы сделать его более ясным можно инвертировать ключ и значение из словаря. Это чтобы значения ключей и ключи значений, как видно здесь.
mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.iteritems())
print(res[16]) # Prints george
или
mydict = {'george':16,'amber':19}
dict((v,k) for k,v in mydict.iteritems())[16]
что по сути то же, что этот другой ответить.
Вот мой взгляд на эту проблему. :) Я только начал изучать Python, поэтому я называю это:
"по понятным для новичков" и решение.
#Code without comments.
list1 = {'george':16,'amber':19, 'Garry':19}
search_age = raw_input("Provide age: ")
print
search_age = int(search_age)
listByAge = {}
for name, age in list1.items():
if age == search_age:
age = str(age)
results = name + " " +age
print results
age2 = int(age)
listByAge[name] = listByAge.get(name,0)+age2
print
print listByAge
.
#Code with comments.
#I've added another name with the same age to the list.
list1 = {'george':16,'amber':19, 'Garry':19}
#Original code.
search_age = raw_input("Provide age: ")
print
#Because raw_input gives a string, we need to convert it to int,
#so we can search the dictionary list with it.
search_age = int(search_age)
#Here we define another empty dictionary, to store the results in a more
#permanent way.
listByAge = {}
#We use double variable iteration, so we get both the name and age
#on each run of the loop.
for name, age in list1.items():
#Here we check if the User Defined age = the age parameter
#for this run of the loop.
if age == search_age:
#Here we convert Age back to string, because we will concatenate it
#with the person's name.
age = str(age)
#Here we concatenate.
results = name + " " +age
#If you want just the names and ages displayed you can delete
#the code after "print results". If you want them stored, don't...
print results
#Here we create a second variable that uses the value of
#the age for the current person in the list.
#For example if "Anna" is "10", age2 = 10,
#integer value which we can use in addition.
age2 = int(age)
#Here we use the method that checks or creates values in dictionaries.
#We create a new entry for each name that matches the User Defined Age
#with default value of 0, and then we add the value from age2.
listByAge[name] = listByAge.get(name,0)+age2
#Here we print the new dictionary with the users with User Defined Age.
print
print listByAge
.
#Results
Running: *\test.py (Thu Jun 06 05:10:02 2013)
Provide age: 19
amber 19
Garry 19
{'amber': 19, 'Garry': 19}
Execution Successful!
Если вы хотите найти ключ по значению, можно использовать понимание словарь для создания поиска в словаре и затем использовать его, чтобы найти ключ от данного значения.
lookup = {value: key for key, value in self.data}
lookup[value]
Рассмотрите возможность использования панды. Как указано в Уильям Маккинни'ы "и Python для анализа данных'
еще один способ думать о серии как фиксированной длины, приказал дикт, так как он является сопоставление значений индекса к значениям данных. Это может быть используется во многих контекстах, где вы можете использовать дикт.
import pandas as pd
list = {'george':16,'amber':19}
lookup_list = pd.Series(list)
В запросе ваших рядов выполните следующие действия:
lookup_list[lookup_list.values == 19]
Который дает:
Out[1]:
amber 19
dtype: int64
Если вам нужно сделать что-нибудь еще с выхода преобразуют ответа в списке могут быть полезны:
answer = lookup_list[lookup_list.values == 19].index
answer = pd.Index.tolist(answer)
Здесь, recover_key берет словарь и значение, которое требуется найти в словаре. Мы потом перебирать ключи в словарь и сравнить с значением и вернуть этот ключ.
def recover_key(dicty,value):
for a_key in dicty.keys():
if (dicty[a_key] == value):
return a_key
вот мой взгляд на это. Это хорошо для отображения нескольких результатов только в случае, если вам нужно. Поэтому я добавил в список, а также
myList = {'george':16,'amber':19, 'rachel':19,
'david':15 } #Setting the dictionary
result=[] #Making ready of the result list
search_age = int(input('Enter age '))
for keywords in myList.keys():
if myList[keywords] ==search_age:
result.append(keywords) #This part, we are making list of results
for res in result: #We are now printing the results
print(res)
И что'с ним...
Там нет простой способ, чтобы найти ключ, в списке 'смотрит' значение. Однако, если вы знаете значение, перебирая ключи, вы можете искать значения в словаре элементом. Если d[элемент], где D-объект словаря, равна ключ вы'вновь пытается смотреть вверх, можно выполнить некоторый код.
D = {'Ali': 20, 'Marina': 12, 'George':16}
age = int(input('enter age:\t'))
for element in D.keys():
if D[element] == age:
print(element)
def get_Value(dic,value):
for name in dic:
if dic[name] == value:
del dic[name]
return name
это'ов ответил, но это может быть сделано с причудливым 'карту/уменьшить', например:
def find_key(value, dictionary):
return reduce(lambda x, y: x if x is not None else y,
map(lambda x: x[0] if x[1] == value else None,
dictionary.iteritems()))