【问题标题】:python :: iterate through nested JSON resultspython :: 遍历嵌套的 JSON 结果
【发布时间】:2016-12-27 04:51:17
【问题描述】:

遍历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 循环进行迭代所以我return ALL ids_

【问题讨论】:

  • 所有ids?您需要向我们展示您的 results 数据结构的结构(以及您希望 id 值来自哪个或多个级别),以便对此负责。也许你想要[x['owner']['id'] for x in results['playlists']['items']],但这只是猜测。

标签: python json loops iteration


【解决方案1】:
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'],因此以一种更有效的方式进行进一步处理,它的可读性不会那么高。我还可以将结果附加到一个空列表中。谢谢。
【解决方案2】:

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

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

【讨论】:

  • 为什么是发电机?整个结构似乎已经加载到内存中。
【解决方案3】:

您可以遍历 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']]

【讨论】:

    【解决方案4】:

    实际上,您的文档是这样的:

    { "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']
    猜你喜欢
    • 2022-01-01
    • 2020-04-09
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多