사전 키를 사용할 수 없으면 None을 반환합니다.


489

키가 존재하는 경우 사전 값을 얻거나 None그렇지 않은 경우 단순히 반환하는 방법이 필요합니다 .

그러나 KeyError존재하지 않는 키를 검색하면 Python에서 예외 가 발생합니다. 키를 확인할 수는 있지만보다 명확한 것을 찾고 있습니다. None키가 존재하지 않으면 반환하는 방법 이 있습니까?


74
.get(key)[key]
Gabe

12
dict는 KeyError 예외를 발생시킵니다. "key_error를 리턴하지 않습니다".
Ber

3
파이썬에서는 키에 액세스하고 예외를 잡는 것이 완벽합니다. 잘 알려져 있고 자주 사용되는 디자인 패턴이기도합니다. 대신 None을 반환하면 None을 값으로 저장하는 것이 불가능 해지며 경우에 따라 관련이있을 수 있습니다.
Ber

1
때로는 사전의 "없음"항목과 누락 된 항목을 동일하게 취급하려고합니다.이 경우 허용 된 답변이 제대로 작동하는 것 같습니다.
cib

@Ber 나는 명확히하기 위해 질문을 편집했습니다. 당신도 그렇게 할 수있었습니다.
törzsmókus

답변:


813

당신이 사용할 수있는 dict.get()

value = d.get(key)

Noneif 을 반환 합니다 key is not in d. 다음 대신에 반환되는 다른 기본값을 제공 할 수도 있습니다 None.

value = d.get(key, "empty")

47
기본 폴백을 사용하는 두 번째 변형 None은 키가 Nonedict에 명시 적으로 매핑 된 경우 에도 여전히 반환 됩니다 . 그것이 당신이 원하는 것이 아니라면, 당신은 같은 것을 사용할 수 있습니다 d.get(key) or "empty".
cib

15
@cib : 좋은 지적이 있지만,이 솔루션은 비슷한 문제가 - 키가 어떤 "falsy"값에 매핑되는 경우 (같은 [], "", False, 0.0또는 실제로 None), 다음 솔루션은 항상 반환합니다 0. Nones를 값으로 예상 하면 if key in d:명시 적으로 확인 해야합니다 .
Tim Pietzcker

1
@cib는 그것을 응원합니다. 여기서 내가 잘못하고있는 것을 해결할 수 없었습니다.
wobbily_col

@ TimPietzcker-답을 설명해 주시겠습니까? 내가 틀리지 않은 경우 키가 '거짓'값에 매핑되는 경우 d.get (key) 또는 "empty"는 "empty"입니다.
MiloMinderbinder

@MiloMinderbinder : 의 유효한 키가 아닌 "empty"경우 반환됩니다 . 값 이 매핑되는 것과는 아무런 관련이 없습니다 . keydkey
Tim Pietzcker 2014 년

63

더 이상 궁금하지 않습니다. 언어에 내장되어 있습니다.

    >>> 도움말 (dict)

    모듈 내장의 클래스 dict에 대한 도움말 :

    클래스 dict (객체)
     | dict ()-> 새로운 빈 사전
     | dict (mapping)-> 매핑 객체에서 초기화 된 새 사전
     | (키, 값) 쌍
    ...
     |  
     | 가져 오기(...)
     | D.get (k [, d])-> D [k] D에서 k이면 d. 그렇지 않으면 d. d의 기본값은 없음입니다.
     |  
    ...

22

사용하다 dict.get

키가 사전에있는 경우 키 값을 리턴하고 그렇지 않으면 기본값을 리턴합니다. 기본값이 지정되지 않은 경우 기본값은 없음으로 설정되므로이 메소드는 KeyError를 발생시키지 않습니다.


19

클래스 의 get()메소드를 사용해야합니다dict

d = {}
r = d.get('missing_key', None)

결과는 r == None입니다. 키가 사전에 없으면 get 함수는 두 번째 인수를 반환합니다.


19
None명시 적으로 전달할 필요는 없습니다 . 기본값입니다.
Björn Pollex

18

보다 투명한 솔루션을 원하면 서브 클래스 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

2
@ marineau : 다른 대답에 대한 의견에서 언급했듯이 문제 defaultdict는 아직 거기에없는 요소가 요청 될 때마다 커질 것이라는 것입니다. 항상 바람직한 것은 아닙니다.
Björn Pollex 21

@ BjörnPollex 이것은 매우 우아한 것입니다. 깊이를 지원하기 위해 이것을 확장하는 방법에 대한 단서가 있습니까? 나는 예외 대신에 foo['bar']['test']['sss']돌아 오는 것을 의미한다 None. 한 번의 깊이 이후에 TypeError대신에KeyError
hehem

@itsneo. 의 전체 구조를 만들 수 NoneDicts있습니다. 이것은 KeyError가장 안쪽의 객체에서 발생하는 경우 도움이 될 것 입니다. 그렇지 않으면 문제는 None객체를 반환 하면 더 이상 가입 할 수 없다는 것입니다. 못생긴 해킹은 다음과 같이 테스트하는 다른 객체를 반환하는 것 None입니다. 그러나 이로 인해 끔찍한 버그가 발생할 수 있습니다.
magu_

@ BjörnPollex로 변경해 return dict.get(self, key)return super().get(key)되나요? 예를 들어 dict 대신 OrderedDict를 사용하기로 결정하면 여러 줄의 코드를 변경하는 것에 대해 걱정할 필요가 없습니다.
Wood

@Wood 예, 실제로 훨씬 더 좋을 것입니다!
Björn Pollex

12

나는 보통 이와 같은 상황에 대해 기본 결정 을 사용합니다 . 인수를 취하지 않고 새 키를 볼 때 값을 작성하는 팩토리 메소드를 제공합니다. 새 키의 빈 목록과 같은 것을 반환 할 때 더 유용합니다 ( 예 참조 ).

from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key']  # prints 'None'

19
문제 defaultdict는 존재하지 않는 요소가 요청 될 때마다 계속 증가한다는 것입니다.
Björn Pollex 21:29에

8

다른 사람들이 이미 제안한 것처럼 dict객체의 get()방법을 사용할 수 있습니다 . 또는 정확히 수행중인 작업에 따라 다음 try/except과 같은 제품군을 사용할 수 있습니다 .

try:
   <to do something with d[key]>
except KeyError:
   <deal with it not being there>

이 사건을 처리하는 데 매우 "Pythonic"접근 방식으로 간주됩니다.


7

한 줄 해결책은 다음과 같습니다.

item['key'] if 'key' in item else None

새 목록에 사전 값을 추가하고 기본값을 제공하려는 경우에 유용합니다.

예.

row = [item['key'] if 'key' in item else 'default_value']

5

다른 사람들이 위에서 말했듯이 get ()을 사용할 수 있습니다.

그러나 키를 확인하기 위해 다음을 수행 할 수도 있습니다.

d = {}
if 'keyname' in d:

    # d['keyname'] exists
    pass

else:

    # d['keyname'] does not exist
    pass

나는 당신이 이미 이것을하는 방법을 이미 알고있는 것을 본다. 내 게시물을 삭제하려고했지만 다른 사람을 위해 참고 용으로 남겨 두겠습니다.
Marek P

4
이 방법은 일반적으로 키가있을 때 키를 두 번 조회해야하므로 get방법 의 이유 일 수 있습니다.
martineau

0

python2 대 python3에서 가능한 것에 의해 뒤쳐졌습니다. 나는 python3을 위해 무엇을했는지에 따라 대답 할 것입니다. 내 목표는 간단했다 : 사전 형식의 json 응답에 오류가 있는지 확인하십시오. 내 사전은 "토큰"이라고하고 내가 찾는 키는 "오류"입니다. 키 "error"를 찾고 있는데 None 값으로 설정하지 않은 경우 확인은 값이 None인지 확인한 다음 코드를 진행하십시오. 키가 "오류"인 경우 else 문이 처리됩니다.

if ((token.get('error', None)) is None):
    do something

-2

당신이 그것을 함께 할 수 있다면 False, 다음, 거기에 또한 으로 hasattr 내장 된 연료 소모량은 :

e=dict()
hasattr(e, 'message'):
>>> False
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.