python3通過字典的value(值)獲取對(duì)應(yīng)的key(鍵)

這個(gè)問題是在寫接口自動(dòng)化程序的過程中,有個(gè)場景希望能通過字典的value獲取對(duì)應(yīng)的key,在網(wǎng)上找到了解決方案,這里自己加一些注解放出來,希望能讓大家明白是如何實(shí)現(xiàn)的。

網(wǎng)友的原代碼形式如下

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

代碼特別簡潔,返回一個(gè)列表,但是可能有些同學(xué)不太明白如何實(shí)現(xiàn)的,下面對(duì)該代碼進(jìn)行一個(gè)變裝:

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

上面這兩個(gè)代碼的效果是一樣的,測試結(jié)果如下

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'))

執(zhí)行結(jié)果:
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呢?重點(diǎn)就在于字典的items()這個(gè)方法的返回值上,見下面的代碼

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

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

可以看到,items()方法會(huì)遍歷字典的每個(gè)key-value鍵值對(duì)并將每個(gè)鍵值對(duì)以元組的形式保存,其中key為第一個(gè)元素,value為第二個(gè)元素,即(key, value),并且會(huì)將所有的鍵值對(duì)元組以列表的形式返回。因此可以對(duì)items()返回值的列表進(jìn)行遍歷后處理(key, value)就可以得到想要的key。需要注意的是,一個(gè)value可能會(huì)對(duì)應(yīng)多個(gè)key。

容錯(cuò)處理
上面兩個(gè)函數(shù)在正常傳參的情況下可以正確返回想要的結(jié)果,但是如果第一個(gè)參數(shù)myDict不是字典形式,就會(huì)拋出異常,如下:

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

結(jié)果:
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'

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

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, '北京'))

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

注意:
大家正式使用的時(shí)候,要做個(gè)判斷,正確返回了key時(shí)再繼續(xù)往下執(zhí)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容