2016-08-19 125 views
4

迭代通过JSONresults有时会变得相当混乱。 说我有一个function像这样:python ::遍历嵌套的JSON结果

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_

+2

所有这些'id's的?你需要向我们展示你的'结果'数据结构的结构(以及你想要'id'值的级别或级别),以便为此负责。也许你想在结果['playlists'] ['items']]'中为[x ['owner'] ['id']],但这只是一个猜测。 – Blckknght

回答

3
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']) 

这是假设我已经猜中你的对象的结构基础上,你已经展示了什么。不过,希望这些例子能让你更好地思考如何将复杂结构分解为有意义的块。

+0

你猜对了。虽然列表理解会返回像这样的数据结构:'u'handiofiblood',u'holgar_the_red',u'thedlord',u'slokra',u'1121479704',u'joakim56789',u'twiggywasp',u 'killnot',u'slashxero',u'sandpapersparkle']',因此以更有效的方式进行进一步处理,它不会有太多的可读性。我也可以将结果追加到一个空列表中。谢谢。 –

0

这个怎么样?您可以使用发电机来实现自己的目标

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

为什么使用发生器?整个结构似乎已经加载到内存中。 –

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']] 
+0

你的单线不太正确。 '所有者[ '所有者'] [ 'ID']' –