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}]
>>> 

但是,在提取之前不知道二级键的值的情况下,如何确定大小?

4

2 回答 2

2

如果您说密钥120714未知,那么如果 下只有一个密钥d['query']['pages'],则执行以下操作:

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

它看起来像这样:

>>> 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}]
于 2013-03-16T04:54:27.920 回答
2

这个问题不是很清楚,但我会试着猜测你想要做什么,希望即使我猜错了它也会告诉你答案。

你不知道你有哪些页面。但是你知道,无论你有什么页面,你都想要它们的大小。换句话说,您想要访问 的所有值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']
于 2013-03-16T04:55:49.443 回答