은 거기에 더 많은 읽을 수 있는 방법을 확인하는 경우 키에 묻혀 dict 존재하는지 확인하지 않고 각각의 수준을 독립적으로?
고 말할 수 있습니다 내가 이 값을 객체 매장(예를 들어에서 찍은 위키데이터):
x = s['mainsnak']['datavalue']['value']['numeric-id']
지 확인하는 것 이것으로 끝나지 않은 런타임 오류가 필요하거나 모든 수준의는 다음과 같이
if 'mainsnak' in s and 'datavalue' in s['mainsnak'] and 'value' in s['mainsnak']['datavalue'] and 'nurmeric-id' in s['mainsnak']['datavalue']['value']:
x = s['mainsnak']['datavalue']['value']['numeric-id']
다른 방법으로 생각할 수 있고 이 문제를 해결하는 포장이에요 잡을`구성하는 느낌이 아니라도 어색한 이러한 간단한 작업입니다.
내가 찾는 다음과 같습니다.
x = exists(s['mainsnak']['datavalue']['value']['numeric-id'])
을 반환하는진정한
경우 모든 수준이 존재합니다.
간략하게 설명하기 위해,Python 를 신뢰해야 합니다 그것은쉽게 용서를 구하는 것보다는 허가
try:
x = s['mainsnak']['datavalue']['value']['numeric-id']
except KeyError:
pass
여기에 내가 어떻게 거래와 중첩 dict 키:
def keys_exists(element, *keys):
'''
Check if *keys (nested) exists in `element` (dict).
'''
if not isinstance(element, dict):
raise AttributeError('keys_exists() expects dict as first argument.')
if len(keys) == 0:
raise AttributeError('keys_exists() expects at least two arguments, one given.')
_element = element
for key in keys:
try:
_element = _element[key]
except KeyError:
return False
return True
예제:
data = {
"spam": {
"egg": {
"bacon": "Well..",
"sausages": "Spam egg sausages and spam",
"spam": "does not have much spam in it"
}
}
}
print 'spam (exists): {}'.format(keys_exists(data, "spam"))
print 'spam > bacon (do not exists): {}'.format(keys_exists(data, "spam", "bacon"))
print 'spam > egg (exists): {}'.format(keys_exists(data, "spam", "egg"))
print 'spam > egg > bacon (exists): {}'.format(keys_exists(data, "spam", "egg", "bacon"))
출력:
spam (exists): True
spam > bacon (do not exists): False
spam > egg (exists): True
spam > egg > bacon (exists): True
그것은 루프에서 주어진element
테스트 각 키에서 주어진 순서입니다.
I prefere 이 모든변수입니다.get('키',{})
방법을 발견했기 때문에 그것이 다음과 같EAFP.
기능 제외하라는 다음과 같:keys_exists(dict_element_to_test,'key_level_0','key_level_1','key_level_n',..)
. 적어도 두 개의 인수가 필요한 요소 및 하나의 핵심이지만,추가할 수 있습니다 얼마나 많은 열쇠를 당하고 싶습니다.
를 사용해야 하는 경우 종류의 지도,당신이 무언가를 할 수 있 다음과 같:
expected_keys = ['spam', 'egg', 'bacon']
keys_exists(data, *expected_keys)
Try/을 제외 될 것으로 보인 가장 pythonic 를 할 수 있는 방법. 다음과 같은 재귀적 기능을 작동해야(반환이 없는 경우 하나의 열쇠를 찾을 수 없 dict):
def exists(obj, chain):
_key = chain.pop(0)
if _key in obj:
return exists(obj[_key], chain) if chain else obj[_key]
myDict ={
'mainsnak': {
'datavalue': {
'value': {
'numeric-id': 1
}
}
}
}
result = exists(myDict, ['mainsnak', 'datavalue', 'value', 'numeric-id'])
print(result)
>>> 1
나는 당신이 사용하는python-베네딕트
,고체 python dict 서브 클래스 전체 keypath 지원하고 많은 유틸리티는 방법이 있습니다.
당신은 단지를 캐스팅해야 기존 dict:
s = benedict(s)
지금 당신의 dict 전체 keypath 지원하고 확인할 수 있는 경우 키에 존재하는 pythonic 방법으로,를 사용하여 운영:
if 'mainsnak.datavalue.value.numeric-id' in s:
# do stuff
여기에는 라이브러리 repository 및 문서: https://github.com/fabiocaccamo/python-benedict
당신이 사용할 수 있는pydash
을 확인 존재하는 경우:http://pydash.readthedocs.io/en/latest/api.html#pydash.objects.has
또는 값을 얻을(당신은 설정할 수 있습니다 기본을 반환하는 경우에는't 존재하):http://pydash.readthedocs.io/en/latest/api.html#pydash.objects.has
다음 예를 참고하십시오.
>>> get({'a': {'b': {'c': [1, 2, 3, 4]}}}, 'a.b.c[1]')
2
Try/를 제외한 방법으로는 가장 깨끗한입니다. 그러나,그것은 또한 카운트에서 예외로 나 IDE 는 정지하는 동안 실행하여 디버깅할 수 있습니다.
또한,저는 좋아하지 않을 사용하여 예외로서 방법을 제제표는 기본적으로 일어나고 있는 것이 try/잡을 수 있습니다.
여기에는 짧은 솔루션을 사용하지 않는 재귀를 지원하고,기본값:
def chained_dict_lookup(lookup_dict, keys, default=None):
_current_level = lookup_dict
for key in keys:
if key in _current_level:
_current_level = _current_level[key]
else:
return default
return _current_level
나는 같은 문제를 가지고 있었습니다 그리고 최근 python lib 팝업: https://pypi.org/project/dictor/ https://github.com/perfecto25/dictor
그래서 당신의 경우: `` 에서 dictor 가져오기 dictor
x=dictor(s,'mainsnak.datavalue.값이 있습니다.숫자 id') ``
개인적인 참고: I don'다음과 같 t'dictor'이름,지 않기 때문't 힌트 무엇을 실제로는 않습니다. 그래서 나는'm 처럼 사용한다:
에서 dictor 가져오기 dictor 로 추출물 x=추출물(s,'mainsnak.datavalue.값이 있습니다.숫자 id')
수't 더 나은 이름보다는추출
. 한 의견 주시기 바랍니다면,당신이 더 많은 가능한 지명하고 있다.safe_get
,robust_get
지 않았't 에 대한 느꼈을 수도 있습니다.
썼 데이터 분석 라이브러리는dataknead
](https://github.com/hay/dataknead 의)이 같은 경우,기본적으로하기 때문에 나는 좌절에 의 JSON 돌 API 를 반환합니다.
와 함께하는 라이브러리는 당신이 뭔가를 할 수 있습니다
from dataknead import Knead
numid = Knead(s).query("mainsnak/datavalue/value/numeric-id").data()
if numid:
# Do something with `numeric-id`