2013-03-16 1 views
0

내가 데이터 구조 다음 API를 호출하고 점점 오전 :추출 값이

{u'query': {u'pages': {u'120714': {u'ns': 0, u'pageid': 120714, u'revisions': [{u'size': 985}], u'title': u'Daniel Nannskog'}}, u'userinfo': {u'anon': u'', u'id': 0, u'name': u'2620:0:862:101:0:0:2:4'}}} 

내가 원하는 것은이 데이터 구조에서 크기를 얻을 수 있습니다, 여기에서 데이터를 추출하는 방법을 알고 하지만 문제는, 예를 들어, 내가 페이지 후 키 (120714)를 모르는 추출시입니다 :

lets assign this to a variable = d 
>>> d 
{u'query': {u'pages': {u'120714': {u'title': u'Daniel Nannskog', u'ns': 0, u'pageid': 120714, u'revisions': [{u'size': 985}]}}, u'userinfo': {u'anon': u'', u'id': 0, u'name': u'2620:0:862:101:0:0:2:4'}}} 
>>> d['query']['pages']['120714']['revisions'] 
[{u'size': 985}] 
>>> 

하지만 내가 어떻게 두 번째 수준 키 이전의 값을 모른 채 크기를 얻을 수 있습니다 추출? 당신은 키 120714를 알 수 있다는 말을하는 경우 d['query']['pages']에서 단 하나의 키가있는 경우

+0

내가 문제를 이해하지 않습니다 예를 들어

, 당신은 하나 개의 버전 만 한 페이지가 알고있는 경우는, 모든 일을 할 줄입니다. 모든 페이지'foo'에 대해 모든'd [ 'query'] [ 'pages'] [foo] [ 'revisions'] [ 'size']를 찾으려고합니까? – abarnert

+1

아마도 "do not"라는 단어가 누락 된 것일까 요? "... 추출 할 때 ** 페이지 다음에 키 (120714)를 알지 못합니다 ..."? – abarnert

+0

또한,'revisions'는 하나의 값이 아닌'list'를 가지고 있습니다. 그래서 여러 값들이있을 수 있기 때문에 당신은 _the_ 크기를 얻을 수 없습니다. 그들 모두를 원하니? 첫번째? 가장 긴? 전체? – abarnert

답변

2

:

e = d['query']['pages'] 
key = e.keys()[0] 
print e[key]['revisions'] 

은 다음과 같습니다 질문은 명확하지 않지만, 당신이하려는 일을 추측하려고 노력할 것입니다. 그리고 내가 틀렸을지라도 대답을 보여줄 것입니다.

보유하고있는 페이지를 알 수 없습니다. 그러나 어떤 페이지를 가지고 있더라도 그 크기를 원한다는 것을 알고 있습니다. 즉, 값이 갖는 키의 값이 모두 pages 인 모든 값에 액세스하려고합니다. dict.values이 바로 이러한 작업을 수행하는 것입니다

:

sizes = [page['revisions'][0]['size'] for page in d['query']['pages'].values()] 

당신이 목록의 이해를 이해하지 않는 경우, 현실을 분해하자 : 나는 첫 번째 버전을 따기있어

pages = d['query']['pages'] 
# {u'120714': {u'ns': 0, u'pageid': 120714, 
#    u'revisions': [{u'size': 985}], u'title': u'Daniel Nannskog'}} 
every_page = pages.values() 
# [{u'ns': 0, u'pageid': 120714, 
# u'revisions': [{u'size': 985}], u'title': u'Daniel Nannskog'}] 
sizes = [] 
for page in every_page: 
    # {u'ns': 0, u'pageid': 120714, 
    # u'revisions': [{u'size': 985}], u'title': u'Daniel Nannskog'} 
    sizes.append(page['revisions'][0]['size']) 

알 수 있습니다. 버전의 모든 크기, 또는 가장 큰 크기, 또는 크기의 합 또는 최신 또는 다른 것을 원한다면 수정할 필요가 없습니다.

동일한 내용이 페이지에 적용됩니다. 첫 번째 페이지 또는 가장 큰 페이지 또는 크기를 합한 페이지의 크기 만 원하는 경우 무엇이든 변경할 수 있습니다.

size = d['query']['pages'].values()[0]['revisions'][0]['size'] 
+0

좋은 설명을 주셔서 감사합니다. 예 이제 모든 것이 목록 이해력에 달려 있습니다. 다시 한번 감사드립니다. –

+0

나는 하나의 레코드를 얻으려고 API 호출을 썼다. 나는 하나의 레코드만을 얻고 있기 때문에 다음과 같이 추가했다.pages [ 'page']. [0] –

+0

페이지가 하나만있는 경우 페이지 크기가 [page [ 'revisions'] [0] [ 'size'] d [ , 당신은 단지 하나의 가치의 목록 일 것이기 때문에 당신은 목록 이해력을 _ 필요로하지 않습니다. 그냥'd [ 'query'] [ 'pages']. values ​​() [0] [ 'revisions'] [0] [ 'size']'. ([revisions] [0] [ 'size']'비트를 포함하는 주된 이유는 이것에 대한 암시 였지만 분명히 그것은 좋은 힌트가 아니 었습니다 ... 죄송합니다.) – abarnert

2

, 다음, 당신은이 작업을 수행 :

>>> d = {u'query': {u'pages': {u'120714': {u'title': u'Daniel Nannskog', u'ns': 0, u'pageid': 120714, u'revisions': [{u'size': 985}]}}, u'userinfo': {u'anon': u'', u'id': 0, u'name': u'2620:0:862:101:0:0:2:4'}}} 
>>> e = d['query']['pages'] 
>>> key = e.keys()[0] 
>>> print e[key]['revisions'] 
[{u'size': 985}] 
+2

훨씬 간단한 e.values ​​() [0] 대신 [e [e.keys() [0]]가 필요한 이유는 무엇입니까? – abarnert

+0

e.values ​​() [0]에서 크기를 얻는 방법은 무엇입니까? –

+1

@ Null-hypothesis : e.values ​​() [0] [ 'revisions']는'key = e.keys() [0]'와'e [key] [ 'revisions' ]', 그래서 당신은 그것을 같은 방식으로 얻는다 : e.values ​​() [0] [ 'revisions'] [0] [ 'size']'. – abarnert