2016-11-13 38 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')]} 
相關問題