Python: 如何迭代嵌套 JSON 结果

6

有时遍历JSON results可能会令人困惑。假设我有一个如下的function

def get_playlist_owner_ids(query):

    results = sp.search(q=query, type='playlist')
    id_ = results['playlists']['items'][0]['owner']['id']
    return (id_)

我可以获取id_,这很有效。

但是如何使用for i in x循环迭代,以便我返回所有ids_


2
所有的 id 是哪些?为了能够回答这个问题,您需要向我们展示您的 results 数据结构的结构(以及您想要从哪个级别或几个级别获取 id 值)。也许您想要 [x['owner']['id'] for x in results['playlists']['items']],但这只是一个猜测。 - Blckknght
4个回答

5
results['playlists']['items'][0]['owner']['id']
                              ^___ this is a list index

因此:
for item in results['playlists']['items']:
    print(item['owner']['id'])

为了让事情更易读,通常会方便地创建中间变量。

playlist_items = results['playlists']['items']
for item in playlist_items:
    owner = item['owner']
    print(owner['id'])

假设我已经正确猜测了您对象的结构,这只基于您展示的内容。希望这些例子能够为您提供更好的思考方式,将复杂的结构分解成有意义的块。

你猜对了。虽然列表推导会返回这样的数据结构:[u'handiofiblood', u'holgar_the_red', u'thedoomlord', u'slokra', u'1121479704', u'joakim56789', u'twiggywasp', u'killnot', u'slashxero', u'sandpapersparkle'],因此更高效地进行进一步处理,但可读性不如其他方式。我也可以将结果附加到一个空列表中。谢谢。 - 8-Bit Borges

0

这样怎么样?你可以使用生成器来实现你的目标

def get_playlist_owner_ids(query):
    results = sp.search(q=query, type='playlist')
    for item in results['playlists']['items']:
        yield item['owner']['id']

为什么需要一个生成器?整个结构似乎已经加载到内存中了。 - Two-Bit Alchemist

0
你可以遍历 results['playlists']['items'],或者更好的方法是使用列表推导式:
def get_playlist_owner_ids(query):

    results = sp.search(q=query, type='playlist')
    return [x['owner']['id'] for x in results['playlists']['items']]

0

实际上,您的文档类似于这样:

{ "playlists": {
    "items":[
        {"owner":{"id":"1"},...},                 
        {"owner":{"id":"2"},...},
        {"owner":{"id":"3"},...},
        ...,
}

所以你必须循环遍历项目列表。

你可以像这样做

ids = []
items = results['playlists']['items']
for item in items:
    ids.append(item['owner']['id'])

return ids

或者如果你想要一行代码:

ids = [item['owner']['id'] for owner in results['playlists']['items']]

你的一行代码不太对。owner['owner']['id'] - Two-Bit Alchemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接