2016-07-21 68 views
0

我正在使用python,並且在我的代碼中使用了dict如果密鑰在字典中有僞造值,則獲取默認值

我有我總是需要default值的情況下,如果給key不存在或如果key存在,它有falsy價值。

例如

x = {'a': 'test', 'b': False, 'c': None, 'd': ''} 
print x.get('a', []) 
test 
print x.get('b', []) # Need [] as False is falsy value in python 
False 
print x.get('e', []) # This will work fine, because `e` is not valid key 
None 
print x.get('c', []) 
None 
print x.get('c', []) or [] # This gives output which I want 

相反檢查Falsy價值的or操作,是否有任何Python的方式讓我的默認值?

+0

它是Python的;另一種方法是,如果你想讓它自動發生,就是繼承dict並實現__getitem__。 – Fhaab

+2

我會注意到用'x.get('c',[])或[]',第一個'[]'是不需要的。由於它是假的,你永遠不會返回它,而是在'或'後面使用第二個'[]'。所以只需使用'x.get('c')或[]'。 – Blckknght

+0

謝謝@Blckknght,但是我的例子也需要'notexistkey'在這種情況下'c'可用,但如果其他鍵不可用,那麼'.get('notexistkey',[])'將返回值。 – Nilesh

回答

2

使用or返回您的默認值是Pythonic。我不確定你會得到更多可讀的解決方法。

關於在docs使用or

這是一個短路操作者,所以它僅在第一個是假評估第二 參數。

你還必須考慮該值必須是第一次訪問,纔可以再爲FalsyTruthy進行評估。

0

下面是一個醜陋的黑客攻擊:

from collections import defaultdict 

x = {'a': 'test', 'b': False, 'c': None, 'd': ''} 
d = defaultdict(lambda : [], dict((k, v) if v is not None else (k, []) for k, v in x.items())) 
print(d['a']) 
# test 
print(d['b']) 
# False 
print(d['e']) 
# [] 
print(d['c']) 
# [] 
相關問題