Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用多个“for”循环解码嵌套JSON_Python_Json_Serialization_For Loop_Nested - Fatal编程技术网

Python 使用多个“for”循环解码嵌套JSON

Python 使用多个“for”循环解码嵌套JSON,python,json,serialization,for-loop,nested,Python,Json,Serialization,For Loop,Nested,我上周刚接触Python,已经达到极限。我花了三天的时间在stackoverflow上,但我不知道该怎么做 具有多个嵌套数组。它可以包含三个,如下面的json.txt示例所示,也可以包含30个。我需要循环每一局,然后深入到“局数”,最后得到“边线”的值。这是我困惑的最后一步。有人能提供建议吗 你完全绝望了 意志 首先,不要使用索引,而是直接在列表上循环;这样你就可以给他们起个有意义的名字。顶层是一个条目列表,每个条目是一个带有“innings”键的字典,每个innings是一个字典列表,其中包括

我上周刚接触Python,已经达到极限。我花了三天的时间在stackoverflow上,但我不知道该怎么做

具有多个嵌套数组。它可以包含三个,如下面的json.txt示例所示,也可以包含30个。我需要循环每一局,然后深入到“局数”,最后得到“边线”的值。这是我困惑的最后一步。有人能提供建议吗

你完全绝望了

意志


首先,不要使用索引,而是直接在列表上循环;这样你就可以给他们起个有意义的名字。顶层是一个条目列表,每个条目是一个带有“innings”键的字典,每个innings是一个字典列表,其中包括一个wickets键:

这张照片是:

>>> for entry in data:
...     for inning in entry['innings']:
...         print inning['wickets']
... 
10
9
0
0
这也使得在每个级别添加信息变得更容易:

>>> for entry in data:
...     print entry['description']
...     for i, inning in enumerate(entry['innings']):
...         print 'Innings {}: {} wickets'.format(i + 1, inning['wickets'])
... 
Rest of Sri Lanka v Sri Lanka A at Pallekele, May 14, 2013
Innings 1: 10 wickets
Innings 2: 9 wickets
63rd match: Royal Challengers Bangalore v Kings XI Punjab at Bangalore, May 14, 2013
Innings 1: 0 wickets
Innings 2: 0 wickets
64th match: Chennai Super Kings v Delhi Daredevils at Chennai, May 14, 2013

首先,不要使用索引,而是直接在列表上循环;这样你就可以给他们起个有意义的名字。顶层是一个条目列表,每个条目是一个带有“innings”键的字典,每个innings是一个字典列表,其中包括一个wickets键:

这张照片是:

>>> for entry in data:
...     for inning in entry['innings']:
...         print inning['wickets']
... 
10
9
0
0
这也使得在每个级别添加信息变得更容易:

>>> for entry in data:
...     print entry['description']
...     for i, inning in enumerate(entry['innings']):
...         print 'Innings {}: {} wickets'.format(i + 1, inning['wickets'])
... 
Rest of Sri Lanka v Sri Lanka A at Pallekele, May 14, 2013
Innings 1: 10 wickets
Innings 2: 9 wickets
63rd match: Royal Challengers Bangalore v Kings XI Punjab at Bangalore, May 14, 2013
Innings 1: 0 wickets
Innings 2: 0 wickets
64th match: Chennai Super Kings v Delhi Daredevils at Chennai, May 14, 2013

它看起来很难看,但您可以对其进行细化,但下面是Dict和List任意深度混合的列表:

import os, json,requests
print 'Starting'
url = 'https://dl.dropboxusercontent.com/u/3758695/json.txt'

# download the json string
json_string = requests.get(url)
print 'Downloaded json'

def dig_down(partial_json_list, depth):
    if type(partial_json_list) is list:
        for i in range(len(partial_json_list)):
            print 'index', i, ' at depth', depth,' has', len(partial_json_list[i]) , 'elements'
            if len(partial_json_list[i]) > 1:
                dig_down(partial_json_list[i],depth+1)
    else:
        for k in partial_json_list:
            print 'item at depth', depth, 'equals', k#, ' & has', len(partial_json_list[k]) , 'elements'
            if type(partial_json_list) is list or type(partial_json_list) is dict:
                try:
                    if len(partial_json_list[k]) > 1:
                        dig_down(partial_json_list[k],depth+1)
                except:
                    pass
            else:
                print partial_json_list[k]

# get the content
the_data = json_string.json()
print 'the_data has length ', len(the_data)
dig_down(the_data,0)

它看起来很难看,但您可以对其进行细化,但下面是Dict和List任意深度混合的列表:

import os, json,requests
print 'Starting'
url = 'https://dl.dropboxusercontent.com/u/3758695/json.txt'

# download the json string
json_string = requests.get(url)
print 'Downloaded json'

def dig_down(partial_json_list, depth):
    if type(partial_json_list) is list:
        for i in range(len(partial_json_list)):
            print 'index', i, ' at depth', depth,' has', len(partial_json_list[i]) , 'elements'
            if len(partial_json_list[i]) > 1:
                dig_down(partial_json_list[i],depth+1)
    else:
        for k in partial_json_list:
            print 'item at depth', depth, 'equals', k#, ' & has', len(partial_json_list[k]) , 'elements'
            if type(partial_json_list) is list or type(partial_json_list) is dict:
                try:
                    if len(partial_json_list[k]) > 1:
                        dig_down(partial_json_list[k],depth+1)
                except:
                    pass
            else:
                print partial_json_list[k]

# get the content
the_data = json_string.json()
print 'the_data has length ', len(the_data)
dig_down(the_data,0)

你是说嵌套的深度可以是3或30,或者相同深度的数组的数量可以是3或30?如果您发布了一些您试图解析的json示例,可能会有所帮助。@MarkkuK.:代码中的dropbox URL实际上是活动的。这不是提供示例的最佳方式,但我就是这样得出答案的。您是说嵌套深度可以是3或30,还是说相同深度的数组数可以是3或30?如果您发布了一些您试图解析的json示例,可能会有所帮助。@MarkkuK.:代码中的dropbox URL实际上是活动的。这不是提供样本的最佳方式,但这正是我构建答案的方式。Martijn-非常有用。非常感谢你!这对我的理解是一个巨大的进步;第二部分我还不太懂。例如,打印'Innings{}:{}wickets'。formati+1,Innings['wickets']-括号{}。如何包括第一局和第二局?在我看来,这就像是巫师的魔法@威尔:我所做的只是添加了2份打印报表;向循环添加一个计数器,而只不过是将一些数据放入字符串中的一种方式。@Will:您可以向{}占位符添加数字:'Innings{0}:{1}wickets',但如果忽略它们,Python会自动为您“计数”。Martijn-非常有用。非常感谢你!这对我的理解是一个巨大的进步;第二部分我还不太懂。例如,打印'Innings{}:{}wickets'。formati+1,Innings['wickets']-括号{}。如何包括第一局和第二局?在我看来,这就像是巫师的魔法@威尔:我所做的只是添加了2份打印报表;向循环添加一个计数器,而只不过是将一些数据放入字符串的一种方式。@Will:您可以向{}占位符添加数字:'Innings{0}:{1}wickets',但如果您忽略它们,Python会自动为您“计数”。