2016-11-13 360 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 

目前我得到的错误targetkey没有定义,虽然我认为我的逻辑是在正确的轨道上。有没有人有任何想法如何做到这一点?

+0

如果密钥不存在于字典中,您想怎么做?只要忽略它,引发错误,或返回默认值? –

+0

@ PM2Ring让 - 弗朗索瓦法布尔的解决方案做的是正确的事情,我认为它只是忽略它 – 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,但只有1使用get

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

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

所有方法产生相同的结果访问词典

+0

在您上一个版本中,您需要'如果v:'而不是'如果k:' –

+0

谢谢我给你最好的答案,因为你所有的答案都运行良好,你也帮助我找出了另一个功能,我遇到了麻烦 – warrior4223

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

这使用字典理解,这是一种方便的方式来建立一本字典。你在做什么(修复变量名称后)只会返回一个键和值的单个对(一个元组)。如果你从一个循环返回,你只能返回一件事情:循环不会继续,并同时返回所有其他类似的东西。

+0

感谢您的快速响应,这就完成了我的目标 – warrior4223

0
使用 filter功能

替代解决方案:
我已经有意传递不正确的钥匙Jfilter_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')]} 
相关问题