【问题标题】:How to iterate over nested list of dictionaries?如何遍历嵌套的字典列表?
【发布时间】:2020-11-13 15:45:52
【问题描述】:

我需要得到这个json响应的'ids',问题是,里面有很多字典,里面有一个字典列表,我该怎么做??(PS:len(items)是20,所以我需要以字典的形式获取 20 个 id。

{'playlists': {'href': 'https://api.spotify.com/v1/search?query=rewind-The%25&type=playlist&offset=0&limit=20',
  'items': [{'collaborative': False,
    'description': 'Remember what you listened to in 2010? Rewind and rediscover your favorites.',
    'external_urls': {'spotify': 'https://open.spotify.com/playlist/37i9dQZF1DXc6IFF23C9jj'},
    'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj',
    'id': '37i9dQZF1DXc6IFF23C9jj',
    'images': [{'height': None,
      'url': 'https://i.scdn.co/image/ab67706f0000000327ba1078080355421d1a49e2',
      'width': None}],
    'name': 'Rewind - The Sound of 2010',
    'owner': {'display_name': 'Spotify',
     'external_urls': {'spotify': 'https://open.spotify.com/user/spotify'},
     'href': 'https://api.spotify.com/v1/users/spotify',
     'id': 'spotify',
     'type': 'user',
     'uri': 'spotify:user:spotify'},
    'primary_color': None,
    'public': None,
    'snapshot_id': 'MTU5NTUzMTE1OSwwMDAwMDAwMGQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0Mjdl',
    'tracks': {'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj/tracks',
     'total': 100},
    'type': 'playlist',
    'uri': 'spotify:playlist:37i9dQZF1DXc6IFF23C9jj'},

我正在努力解决这个问题:

dict={'id':''}
for playlists in playlist_data['playlists']:
    for items in playlists['items']:
        for item in items:
            for dic in range(len(item)):
                for id in dic['id']:
                    dict.update('id')
                    print(dict)

我收到此错误:

TypeError: string indices must be integers ```

【问题讨论】:

  • 请提供最小代码。您的代码没有解释的其他事项是,如果您已将 json 处理为字典,因为它可能已被读取为字符串,会产生此错误。
  • for x in dict 迭代它的键。如果您需要键和值,则应显式迭代 dict.values()dict.items()
  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。

标签: python json dictionary


【解决方案1】:

您可以使用对象的键来索引对象。我可以看到对象中有两个地方存在 id。要检索这两个 id 并将它们存储为字典格式,您可以使用以下方法 -

_json = {
  'playlists': {
    'href': 'https://api.spotify.com/v1/search?query=rewind-The%25&type=playlist&offset=0&limit=20',
    'items': [{
      'collaborative': False,
      'description': 'Remember what you listened to in 2010? Rewind and rediscover your favorites.',
      'external_urls': {
        'spotify': 'https://open.spotify.com/playlist/37i9dQZF1DXc6IFF23C9jj'
      },
      'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj',
      'id': '37i9dQZF1DXc6IFF23C9jj',
      'images': [{
        'height': None,
        'url': 'https://i.scdn.co/image/ab67706f0000000327ba1078080355421d1a49e2',
        'width': None
      }],
      'name': 'Rewind - The Sound of 2010',
      'owner': {
        'display_name': 'Spotify',
        'external_urls': {
          'spotify': 'https://open.spotify.com/user/spotify'
        },
        'href': 'https://api.spotify.com/v1/users/spotify',
        'id': 'spotify',
        'type': 'user',
        'uri': 'spotify:user:spotify'
      },
      'primary_color': None,
      'public': None,
      'snapshot_id': 'MTU5NTUzMTE1OSwwMDAwMDAwMGQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0Mjdl',
      'tracks': {
        'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj/tracks',
        'total': 100
      },
      'type': 'playlist',
      'uri': 'spotify:playlist:37i9dQZF1DXc6IFF23C9jj'
    }, ]
  }
}

res_dict = {'id':[items['id'], items['owner']['id']] for items in _json['playlists']['items']}
print(res_dict)

输出:

{'id': ['37i9dQZF1DXc6IFF23C9jj', 'spotify']}

如果您不需要 json 对象中存在的第二个 id,您可以将其从 res_dict 上方删除并将其修改为 -

res_dict = {'id':items['id'] for items in _json['playlists']['items']}

这只会获取 items 数组中存在的 id 作为任何元素的键,而不是任何进一步的嵌套 id(如 items[i]->owner->id 不会像原来那样在最终资源中在第一种情况下)。

【讨论】:

    【解决方案2】:

    试试这样的:

    ids = [item["id"] for item in json_data["playlists"]["items"]]
    

    这称为列表推导。

    您想要遍历 "playlists" 键中的所有 "items"

    您可以访问该项目列表:

    json_data["playlists"]["items"]

    然后你遍历项目中的每个项目:

    for item in json_data["playlists"]["items"]

    然后你访问每个项目的"id"

    item["id"]

    【讨论】:

      猜你喜欢
      • 2015-12-06
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多