2016-07-21 10 views
0

Ich arbeite in Python und verwendet dict in meinem Code.Get Default-Wert, wenn Schlüssel Falscher Wert in dict hat

Ich habe Fall, wo ich immer default Wert benötigen, wenn das geben key nicht existiert oder wenn key existiert und es falsy Wert hat.

zum Beispiel

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 

Statt Kontrolle Falsy Wertes in or Betrieb, gibt es eine Möglichkeit, meinen pythonic Standardwert zu bekommen?

+0

Es ist pythonic; Die Alternative, wenn sie automatisch auftreten soll, besteht darin, dict abzuleiten und __getitem__ zu implementieren. – Fhaab

+2

Ich würde bemerken, dass mit 'x.get ('c', []) oder []' das erste '[]' nicht benötigt wird. Da es falsch ist, wirst du es nie zurückgeben, sondern stattdessen das zweite '[]' hinter dem 'oder' verwenden. Also benutze einfach 'x.get ('c') oder []'. – Blckknght

+0

Danke @Blckknght, aber mein Beispiel benötigt auch 'notexistkey' in diesem Fall' c' ist verfügbar, aber wenn kein anderer Schlüssel verfügbar ist, dann wird '.get ('notexistkey', [])' den Wert zurückgeben. – Nilesh

Antwort

2

Mit or zu zurück Ihr Standardwert ist Pythonic. Ich bin mir nicht sicher, dass Sie eine lesbare Workaround bekommen.

Informationen zur Verwendung von or im docs:

Dies ist ein Kurzschluss Betreiber, so dass er wertet nur das zweite Argument zurück, wenn die ersten falsch ist.

Sie müssen auch bedenken, dass der Wert zuerst zugegriffen worden sein muss, bevor es dann als Falsy ausgewertet werden können oder truthy. Hier

0

ist eine hässliche Hack:

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']) 
# [] 
Verwandte Themen