키가 존재하는 경우 사전 값을 얻거나 None
그렇지 않은 경우 단순히 반환하는 방법이 필요합니다 .
그러나 KeyError
존재하지 않는 키를 검색하면 Python에서 예외 가 발생합니다. 키를 확인할 수는 있지만보다 명확한 것을 찾고 있습니다. None
키가 존재하지 않으면 반환하는 방법 이 있습니까?
키가 존재하는 경우 사전 값을 얻거나 None
그렇지 않은 경우 단순히 반환하는 방법이 필요합니다 .
그러나 KeyError
존재하지 않는 키를 검색하면 Python에서 예외 가 발생합니다. 키를 확인할 수는 있지만보다 명확한 것을 찾고 있습니다. None
키가 존재하지 않으면 반환하는 방법 이 있습니까?
답변:
당신이 사용할 수있는 dict.get()
value = d.get(key)
는 None
if 을 반환 합니다 key is not in d
. 다음 대신에 반환되는 다른 기본값을 제공 할 수도 있습니다 None
.
value = d.get(key, "empty")
None
은 키가 None
dict에 명시 적으로 매핑 된 경우 에도 여전히 반환 됩니다 . 그것이 당신이 원하는 것이 아니라면, 당신은 같은 것을 사용할 수 있습니다 d.get(key) or "empty"
.
[]
, ""
, False
, 0.0
또는 실제로 None
), 다음 솔루션은 항상 반환합니다 0
. None
s를 값으로 예상 하면 if key in d:
명시 적으로 확인 해야합니다 .
"empty"
경우 반환됩니다 . 값 이 매핑되는 것과는 아무런 관련이 없습니다 . key
d
key
클래스 의 get()
메소드를 사용해야합니다dict
d = {}
r = d.get('missing_key', None)
결과는 r == None
입니다. 키가 사전에 없으면 get 함수는 두 번째 인수를 반환합니다.
None
명시 적으로 전달할 필요는 없습니다 . 기본값입니다.
보다 투명한 솔루션을 원하면 서브 클래스 dict
로 다음과 같은 동작을 수행 할 수 있습니다 .
class NoneDict(dict):
def __getitem__(self, key):
return dict.get(self, key)
>>> foo = NoneDict([(1,"asdf"), (2,"qwerty")])
>>> foo[1]
'asdf'
>>> foo[2]
'qwerty'
>>> foo[3] is None
True
defaultdict
는 아직 거기에없는 요소가 요청 될 때마다 커질 것이라는 것입니다. 항상 바람직한 것은 아닙니다.
foo['bar']['test']['sss']
돌아 오는 것을 의미한다 None
. 한 번의 깊이 이후에 TypeError
대신에KeyError
NoneDicts
있습니다. 이것은 KeyError
가장 안쪽의 객체에서 발생하는 경우 도움이 될 것 입니다. 그렇지 않으면 문제는 None
객체를 반환 하면 더 이상 가입 할 수 없다는 것입니다. 못생긴 해킹은 다음과 같이 테스트하는 다른 객체를 반환하는 것 None
입니다. 그러나 이로 인해 끔찍한 버그가 발생할 수 있습니다.
return dict.get(self, key)
도 return super().get(key)
되나요? 예를 들어 dict 대신 OrderedDict를 사용하기로 결정하면 여러 줄의 코드를 변경하는 것에 대해 걱정할 필요가 없습니다.
나는 보통 이와 같은 상황에 대해 기본 결정 을 사용합니다 . 인수를 취하지 않고 새 키를 볼 때 값을 작성하는 팩토리 메소드를 제공합니다. 새 키의 빈 목록과 같은 것을 반환 할 때 더 유용합니다 ( 예 참조 ).
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
defaultdict
는 존재하지 않는 요소가 요청 될 때마다 계속 증가한다는 것입니다.
한 줄 해결책은 다음과 같습니다.
item['key'] if 'key' in item else None
새 목록에 사전 값을 추가하고 기본값을 제공하려는 경우에 유용합니다.
예.
row = [item['key'] if 'key' in item else 'default_value']
다른 사람들이 위에서 말했듯이 get ()을 사용할 수 있습니다.
그러나 키를 확인하기 위해 다음을 수행 할 수도 있습니다.
d = {}
if 'keyname' in d:
# d['keyname'] exists
pass
else:
# d['keyname'] does not exist
pass
get
방법 의 이유 일 수 있습니다.
python2 대 python3에서 가능한 것에 의해 뒤쳐졌습니다. 나는 python3을 위해 무엇을했는지에 따라 대답 할 것입니다. 내 목표는 간단했다 : 사전 형식의 json 응답에 오류가 있는지 확인하십시오. 내 사전은 "토큰"이라고하고 내가 찾는 키는 "오류"입니다. 키 "error"를 찾고 있는데 None 값으로 설정하지 않은 경우 확인은 값이 None인지 확인한 다음 코드를 진행하십시오. 키가 "오류"인 경우 else 문이 처리됩니다.
if ((token.get('error', None)) is None):
do something
당신이 그것을 함께 할 수 있다면 False
, 다음, 거기에 또한 으로 hasattr 내장 된 연료 소모량은 :
e=dict()
hasattr(e, 'message'):
>>> False
.get(key)
[key]