這個問題是在寫接口自動化程式的過程中,有個場景希望能通過字典的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時再繼續往下執行。