>>> d2
{'egg': 3, 'ham': {'grill': 4, 'fry': 6, 'bake': 5}, 'spam': 2}
>>> d2.get('spamx',99)
99
>>> d2.get('ham')['fry']
6
我想獲得火腿內部油炸的價值,如果沒有,請獲取值99或88作爲第二個示例。但是如何?使用默認值進行Python嵌套字典查找
>>> d2
{'egg': 3, 'ham': {'grill': 4, 'fry': 6, 'bake': 5}, 'spam': 2}
>>> d2.get('spamx',99)
99
>>> d2.get('ham')['fry']
6
我想獲得火腿內部油炸的價值,如果沒有,請獲取值99或88作爲第二個示例。但是如何?使用默認值進行Python嵌套字典查找
d2.get('ham', {}).get('fry', 88)
我可能會把它分解成現實生活中的幾個陳述。
ham = d2.get('ham', {})
fry = ham.get('fry', 88)
對於去上班的默認值正確第一默認需要是一本字典,這樣就可以鏈。獲得調用正確如果第一個失敗。
d.get('ham',{}).get('fry',88)
你也可以使用一個嘗試,除塊
def get_ham_fry()
try:
return d['ham']['fry']
except AttributeError,e:
return 88
字符串索引會增加一個如果找不到鍵,則返回「KeyError」;如果該項不支持字符串索引,則返回一個「TypeError」。我認爲'AttributeError'只適用於'get'調用。 – 2014-10-20 00:55:38
如果你需要做這個有很多,你可以寫一個輔助函數
def get_nested(d, list_of_keys, default):
for k in list_of_keys:
if k not in d:
return default
d=d[k]
return d
print get_nested(d2,['ham','spam'],99)
print get_nested(d2,['ham','grill'],99)
感覺像reduce。'functools.reduce(lambda d',x:d [x] if x in d else default,['ham','spam'],d2)' – kennytm 2010-08-09 07:34:00
@KennyTM,爲'['bacon','spam']引發'TypeError' – 2010-08-09 09:14:27
下面是處理解決方案with nested dictionaries:
def get(root, *keys):
"""
Returns root[k_1][k_2]...[k_n] if all k_1, ..., k_n are valid keys/indices.
Returns None otherwise
"""
if not keys:
return root
if keys[0] not in root:
return None
if keys[0] in root:
return get(root[keys[0]], *keys[1:])
用法:
>>> d = {'a': 1, 'b': {'c': 3}}
>>> get(d, 'b', 'c')
3
>>> get(d. 'key that's not in d')
None
>>> get(d)
{'a': 1, 'b': {'c': 3}}
而是'd2.get('ham',{})。get('fry',99)',不是? (DRY!) – mykhal 2010-08-09 06:21:56
讓東西可讀!=重複你自己。重複你自己的功能是編寫一個函數來獲得火腿的魚苗,然後用另一個函數來捕獲垃圾郵件,這兩個函數都可以寫成一個以火腿/垃圾郵件爲參數的函數。 – 2010-08-09 06:38:01
@Jesse,以前的版本有兩個引用'油炸'和兩個引用魔術數字被返回。這個建議是一個明顯的改進。 – Oddthinking 2010-08-09 16:44:25