這個(gè)問題是在寫接口自動(dòng)化程序的過程中辆脸,有個(gè)場(chǎng)景希望能通過字典的value獲取對(duì)應(yīng)的key话原,在網(wǎng)上找到了解決方案,這里自己加一些注解放出來(lái)线衫,希望能讓大家明白是如何實(shí)現(xiàn)的凿可。
網(wǎng)友的原代碼形式如下
def getDictKey_1(myDict, value):
return [k for k, v in myDict.items() if v == value]
代碼特別簡(jiǎn)潔,返回一個(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è)代碼的效果是一樣的唬复,測(cè)試結(jié)果如下
d = {'中國(guó)':'北京', '首都':'北京', '河南':'鄭州', '余額': 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, '北京')= ['中國(guó)', '首都']
getDictKey_1(d, '鄭州')= ['河南']
getDictKey_1(d, 0.01)= ['余額']
getDictKey_1(d, '0.01')= []
getDictKey_2(d, '北京')= ['中國(guó)', '首都']
getDictKey_2(d, '鄭州')= ['河南']
getDictKey_2(d, 0.01)= ['余額']
getDictKey_2(d, '0.01')= []
那么矗积,為什么這樣就可以獲取到key呢全肮?重點(diǎn)就在于字典的items()這個(gè)方法的返回值上,見下面的代碼
d = {'中國(guó)': '北京', '首都': '北京', '河南': '鄭州', '余額': 0.01}
print(d.items())
結(jié)果
dict_items([('中國(guó)', '北京'), ('首都', '北京'), ('河南', '鄭州'), ('余額', 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 = "{'中國(guó)':'北京', '首都':'北京', '河南':'鄭州', '余額': 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 = "{'中國(guó)':'北京', '首都':'北京', '河南':'鄭州', '余額': 0.01}"
print("getDictKey_3(d, '北京')=", getDictKey_3(d, '北京'))
結(jié)果:
getDictKey_3(d, '北京')= False
注意:
大家正式使用的時(shí)候,要做個(gè)判斷粘招,正確返回了key時(shí)再繼續(xù)往下執(zhí)行啥寇。