2016-11-13 3 views
0

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

Пример словаря:

{'P':[("Eight",1460, 225.0, 200.0, "fresco","Netherlands"), 
     ("Six",1465,81.0, 127.1, "tempera", "Netherlands")], 
'V':[("Four",1661, 148.0, 257.0,"oil paint", "Austria"), 
     ("Two",1630, 91.0, 77.0, "oil paint","USA")], 
'K':[("Five",1922,63.8,48.1,"watercolor","USA"), 
     ("Seven",1950,61.0,61.0,"acrylic paint","USA"), 
     ("Two",1965,81.3,100.3,"oil paint","United Kingdom")], 
'C':[("Ten",1496,365.0,389.0,"tempera","Italy")], 
'U':[("Nine",1203,182.0, 957.0,"egg tempera","Italy"), 
     ("Twelve",1200,76.2,101.6,"egg tempera","France")]} 

Так что, если моя функция называется find_the_key и я искал «C» и его значение, то ему необходимо будет вернуть

find_the_key(dictionary2(),['C']) 

return {'C': [('Ten', 1496, 365.0, 389.0, 'tempera','Italy')]} 

Если необходимо найти как «C», так и «V» он вернется

find_the_key(dictionary2(),['C','V']) 

return {'C': [('Ten', 1496, 365.0, 389.0, 'tempera', 'Italy')], 'V': [('Four', 
1661, 148.0, 257.0, 'oil paint', 'Austria'), ('Two', 1630, 91.0, 77.0, 'oil 
paint', 'USA')]} 

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

def find_the_key(dictionary,thekey): 
    for thekey in dictionary.keys(): 
     if dictionary[thekey] == targetkey: 
     return key, targetkey 

В настоящее время я получаю сообщение об ошибке. Целевая кнопка не определена, хотя я думаю, что моя логика находится на правильном пути. Кто-нибудь знает, как это сделать?

+0

Что вы хотите сделать, если ключ не существует в словаре? Просто проигнорируйте его, поднимите ошибку или верните значение по умолчанию? –

+0

@ PM2Ring Решение Jean-François Fabre делает правильную вещь, которая, как мне кажется, просто игнорирует ее – warrior4223

+0

Я считаю, что оба ответа справляются с проблемой, даже не замечая этого :) –

ответ

0

2 способа сделать это:

1) петля на входных словарных элементах сканирование ключа в списке каждый раз, хорошо, но не использует тот факт, что вход является словарем. Если ключевой список или словарь ввода очень долго это может занять некоторое время (улучшить его слегка поворачивая список ключей в set возможно)

def find_the_key(dictionary,thekey): 
    return {k:v for k,v in dictionary.items() if k in thekey} 

2) сделать петлю не в словаре, но в заданных ключах , более логично и быстрее, если список ключей & словарь большие

def find_the_key(dictionary,thekey): 
    return {k:dictionary[k] for k in thekey if k in dictionary} 

Небольшой недостаток: тест, если k принадлежит, а затем получить dictionary[k], который хэширует k дважды

3) классический, не listcomp, но только один доступ к словарю, используя get

def find_the_key(dictionary,thekey): 
    d={} 

    for k in thekey: 
     v = dictionary.get(k) 
     if k: 
      d[k]=v 
    return d 

конечно все методы дают те же результаты

+0

В вашей последней версии вы need 'if v:' вместо 'if k:' –

+0

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

2
def find_the_key(dictionary, target_keys): 
    return {key: dictionary[key] for key in target_keys} 

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

+0

Спасибо за быстрый ответ, который достигает моей цели – warrior4223

0

Альтернативное решение с использованием filter функции:
Я никогда намеренно прошел ненадлежащем ключа J в filter_keys для обработки различных случаев

def find_the_key(dictionary, filter_keys): 
    return dict(filter(lambda i: i[0] in filter_keys, dictionary.items())) 

print(find_the_key(dictionary, ['C','V','J'])) 

Выход:

{'C': [('Ten', 1496, 365.0, 389.0, 'tempera', 'Italy')], 'V': [('Four', 1661, 148.0, 257.0, 'oil paint', 'Austria'), ('Two', 1630, 91.0, 77.0, 'oil paint', 'USA')]} 
Смежные вопросы