天天看點

python3通過字典的value(值)擷取對應的key(鍵)

這個問題是在寫接口自動化程式的過程中,有個場景希望能通過字典的value擷取對應的key,在網上找到了解決方案,這裡自己加一些注解放出來,希望能讓大家明白是如何實作的。

網友的原代碼形式如下

def getDictKey_1(myDict, value):
    return [k for k, v in myDict.items() if v == value]
           

代碼特别簡潔,傳回一個清單,但是可能有些同學不太明白如何實作的,下面對該代碼進行一個變裝:

def getDictKey_2(myDict, value):
    keyList = []
    for k, v in myDict.items():
        if v == value:
            keyList.append(k)
    return keyList
           

上面這兩個代碼的效果是一樣的,測試結果如下

d = {'中國':'北京', '首都':'北京', '河南':'鄭州', '餘額': 0.01}
print("getDictKey_1(d, '北京')=", getDictKey_1(d, '北京'))
print("getDictKey_1(d, '鄭州')=", getDictKey_1(d, '鄭州'))
print("getDictKey_1(d, 0.01)=", getDictKey_1(d, 0.01))
print("getDictKey_1(d, '0.01')=", getDictKey_1(d, '0.01'))

print("getDictKey_2(d, '北京')=", getDictKey_2(d, '北京'))
print("getDictKey_2(d, '鄭州')=", getDictKey_2(d, '鄭州'))
print("getDictKey_2(d, 0.01)=", getDictKey_2(d, 0.01))
print("getDictKey_2(d, '0.01')=", getDictKey_2(d, '0.01'))

執行結果:
getDictKey_1(d, '北京')= ['中國', '首都']
getDictKey_1(d, '鄭州')= ['河南']
getDictKey_1(d, 0.01)= ['餘額']
getDictKey_1(d, '0.01')= []

getDictKey_2(d, '北京')= ['中國', '首都']
getDictKey_2(d, '鄭州')= ['河南']
getDictKey_2(d, 0.01)= ['餘額']
getDictKey_2(d, '0.01')= []
           

那麼,為什麼這樣就可以擷取到key呢?重點就在于字典的items()這個方法的傳回值上,見下面的代碼

d = {'中國': '北京', '首都': '北京', '河南': '鄭州', '餘額': 0.01}
print(d.items())

結果
dict_items([('中國', '北京'), ('首都', '北京'), ('河南', '鄭州'), ('餘額', 0.01)])
           

可以看到,items()方法會周遊字典的每個key-value鍵值對并将每個鍵值對以元組的形式儲存,其中key為第一個元素,value為第二個元素,即(key, value),并且會将所有的鍵值對元組以清單的形式傳回。是以可以對items()傳回值的清單進行周遊後處理(key, value)就可以得到想要的key。需要注意的是,一個value可能會對應多個key。

容錯處理

上面兩個函數在正常傳參的情況下可以正确傳回想要的結果,但是如果第一個參數myDict不是字典形式,就會抛出異常,如下:

d = "{'中國':'北京', '首都':'北京', '河南':'鄭州', '餘額': 0.01}"
print("getDictKey_1(d, '北京')=", getDictKey_1(d, '北京'))

結果:
Traceback (most recent call last):
  File "E:/feedback_record/test.py", line 131, in <module>
    print("getDictKey_1(d, '北京')=", getDictKey_1(d, '北京'))
  File "E:/feedback_record/test.py", line 99, in getDictKey_1
    return [k for k, v in myDict.items() if v == value]
AttributeError: 'str' object has no attribute 'items'
           

很好處理,做個判斷就可以了,如下:

def getDictKey_3(myDict, value):
    if not isinstance(myDict, dict):
        return False
    keyList = []
    for k, v in myDict.items():
        if v == value:
            keyList.append(k)
    return keyList

d = "{'中國':'北京', '首都':'北京', '河南':'鄭州', '餘額': 0.01}"
print("getDictKey_3(d, '北京')=", getDictKey_3(d, '北京'))

結果:
getDictKey_3(d, '北京')= False
           

注意:

大家正式使用的時候,要做個判斷,正确傳回了key時再繼續往下執行。