如何遍历字典的嵌套列表?

时间:2020-07-23 20:07:07

标签: python json dictionary

我需要获取这个json响应的'ids',事实是,里面有很多字典,里面有字典列表,我该怎么做?(PS:len(items)is 20,so我需要以字典的形式获取20个ID。

template<typename T> class Ptr
{
    T* p;
public:
    Ptr(T* t) : p{t} {}
    Ptr(const Ptr& r) {p = r.p;}
    template<typename T2>
    explicit operator Ptr<T2>();
};

template<class T>
template<class T2>
Ptr<T>::operator Ptr<T2>()
{
    return Ptr<T2>{p};
}

class X {};
class Y : public X {};
int main(int argc, char *argv[])
{
    Y y;
    Ptr<Y> py{&y};
    Ptr<X> xp{py};
    //Ptr<X> xp2 = py; // no candidate, thought this would work
    Ptr<X> x2{xp};

    return 0;
}

我正试图通过它来解决这个问题:

{'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)

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

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

这称为列表理解。

您要遍历"items"键内的所有"playlists"

您可以访问该项目列表:

json_data["playlists"]["items"]

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

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

然后,您访问每个项目的"id"

item["id"]

答案 1 :(得分:2)

您可以使用对象的键为对象编制索引。我可以看到在一个对象中存在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将不在最终res中,因为”)。