Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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 在市场和经营者的嵌套结构中解析价格?_Python_Json_For Loop - Fatal编程技术网

Python 在市场和经营者的嵌套结构中解析价格?

Python 在市场和经营者的嵌套结构中解析价格?,python,json,for-loop,Python,Json,For Loop,我对编程相当陌生,我正试图了解如何解析json。具体地说,我正在使用一个字符串来描述足球博彩市场,其中包含(除其他外)单个比赛的值(marketId)、每个可能结果的子值(主客场/抽签)(selectionId),以及可以收回/支付的价格的更多子值(price) 我已经通过json.loads运行了我的代码,我已经将它分配给变量“output” 我试图提取'marketId'的值,然后是相应的子值'selectionId'和'price',如下所示: 我使用for循环打印这些值: for i i

我对编程相当陌生,我正试图了解如何解析json。具体地说,我正在使用一个字符串来描述足球博彩市场,其中包含(除其他外)单个比赛的值(marketId)、每个可能结果的子值(主客场/抽签)(selectionId),以及可以收回/支付的价格的更多子值(price)

我已经通过json.loads运行了我的代码,我已经将它分配给变量“output”

我试图提取'marketId'的值,然后是相应的子值'selectionId'和'price',如下所示:

我使用for循环打印这些值:

for i in output[0]['result']:
    print(i.get('marketId'))
    for j in output[0]['result'][0]['runners']:
        print(j.get('selectionId'))
        for k in output[0]['result'][0]['runners'][0]['ex']['availableToBack']:
            print(k.get('price'))
            for l in output[0]['result'][0]['runners'][0]['ex']['availableToLay']:
                print(l.get('price'))
但当我运行它时,它会返回:


这里的marketId值是可以的,但是当我尝试返回其他嵌套值时,程序会不断返回它遇到的第一组值。我似乎在任何地方都找不到答案-如何让它返回正确的值?

您正在指向每个列表的第一个元素。您的
for
循环每次都允许您访问其他对象,但是嵌套循环会忽略这些元素

当你使用

for i in output[0]['result']:
i
一个接一个地绑定到
'result'
列表中的每个元素,然后打印出这些元素的
marketId

但您的下一个循环将忽略除第一个字典以外的所有字典:

for j in output[0]['result'][0]['runners']:
这里,
output[0]['result'][0]
是绑定到外部循环中的
i
的第一个对象。因此,对于每个
i
,忽略对象(除了使用
'markedId'
键之外),然后只查看第一个此类对象的运行程序

改用
i
'runners'
键:

for i in output[0]['result']:
    print(i.get('marketId'))
    for j in i['runners']:  # i is the object from the outer loop
        print(j.get('selectionId'))
        # ...
i
首先绑定到
output[0]['result'][0]
,然后绑定到
output[0]['result'][1]
,等等,因此
i['runners']
现在可以继续执行并让您处理正确的子结构

对每个嵌套级别执行此操作
j
是另一个字典,所以使用
j['ex']['availableToBack']

您也不需要为
availableToBack
availableToLay
条目嵌套
for
循环,
ex
只包含一个dictionary对象,它有这两个键(引用列表)。您不需要为所有可用的
生成输出,为
可用的返回中的每个价格显示
价格

如果您漂亮地打印Python数据结构,则更容易看到这一切:

>>> pprint(output)
[{'id': 1,
  'jsonrpc': '2.0',
  'result': [{'betDelay': 0,
              'bspReconciled': False,
              'complete': True,
              'crossMatching': True,
              'inplay': False,
              'isMarketDataDelayed': True,
              'lastMatchTime': '2018-02-12T10:56:09.726Z',
              'marketId': '1.139185909',
              'numberOfActiveRunners': 3,
              'numberOfRunners': 3,
              'numberOfWinners': 1,
              'runners': [{'ex': {'availableToBack': [{'price': 1.39,
                                                       'size': 56703.76}],
                                  'availableToLay': [{'price': 1.4,
                                                      'size': 35537.54}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 1.4,
                           'selectionId': 55190,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0},
                          {'ex': {'availableToBack': [{'price': 10.5,
                                                       'size': 3592.64}],
                                  'availableToLay': [{'price': 11.0,
                                                      'size': 5913.05}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 11.0,
                           'selectionId': 1703,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0},
                          {'ex': {'availableToBack': [{'price': 5.2,
                                                       'size': 9136.62}],
                                  'availableToLay': [{'price': 5.3,
                                                      'size': 5361.48}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 5.3,
                           'selectionId': 58805,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0}],
              'runnersVoidable': False,
              'status': 'OPEN',
              'totalAvailable': 1039329.11,
              'totalMatched': 645229.98,
              'version': 2045792715},
             {'betDelay': 0,
              'bspReconciled': False,
              'complete': True,
              'crossMatching': True,
              'inplay': False,
              'isMarketDataDelayed': True,
              'lastMatchTime': '2018-02-12T10:25:33.842Z',
              'marketId': '1.139782182',
              'numberOfActiveRunners': 3,
              'numberOfRunners': 3,
              'numberOfWinners': 1,
              'runners': [{'ex': {'availableToBack': [{'price': 2.22,
                                                       'size': 148.27}],
                                  'availableToLay': [{'price': 2.32,
                                                      'size': 10.1}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 2.3,
                           'selectionId': 18567,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0},
                          {'ex': {'availableToBack': [{'price': 3.8,
                                                       'size': 76.9}],
                                  'availableToLay': [{'price': 3.9,
                                                      'size': 20.57}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 3.85,
                           'selectionId': 62683,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0},
                          {'ex': {'availableToBack': [{'price': 3.2,
                                                       'size': 21.19}],
                                  'availableToLay': [{'price': 3.5,
                                                      'size': 85.41}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 3.25,
                           'selectionId': 58805,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0}],
              'runnersVoidable': False,
              'status': 'OPEN',
              'totalAvailable': 39526.8,
              'totalMatched': 1715.46,
              'version': 2044817355}]}]
如果使用更多描述性名称,代码的可读性会更高:

for response in output:  # loop over the JSONRPC responses
    for market in response['result']:   # each is a market
        print(market['marketId'])
        for runner in market['runners']:
            print(runner['selectionId'])
            for entry in runner['ex']['availableToBack']:
                print(entry['price'])
            for entry in runner['ex']['availableToLay']:
                print(entry['price'])
这将产生:

1.139185909
55190
1.39
1.4
1703
10.5
11.0
58805
5.2
5.3
1.139782182
18567
2.22
2.32
62683
3.8
3.9
58805
3.2
3.5

我已经在json.loads中运行了我的代码,我要处理这个问题:现在您只有Python数据了。你有清单和字典。这不是一个真正的JSON问题,现在只是一个Python数据结构处理问题。但是,您的
输出值是JSON文档,而不是Python数据结构。
>>> pprint(output)
[{'id': 1,
  'jsonrpc': '2.0',
  'result': [{'betDelay': 0,
              'bspReconciled': False,
              'complete': True,
              'crossMatching': True,
              'inplay': False,
              'isMarketDataDelayed': True,
              'lastMatchTime': '2018-02-12T10:56:09.726Z',
              'marketId': '1.139185909',
              'numberOfActiveRunners': 3,
              'numberOfRunners': 3,
              'numberOfWinners': 1,
              'runners': [{'ex': {'availableToBack': [{'price': 1.39,
                                                       'size': 56703.76}],
                                  'availableToLay': [{'price': 1.4,
                                                      'size': 35537.54}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 1.4,
                           'selectionId': 55190,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0},
                          {'ex': {'availableToBack': [{'price': 10.5,
                                                       'size': 3592.64}],
                                  'availableToLay': [{'price': 11.0,
                                                      'size': 5913.05}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 11.0,
                           'selectionId': 1703,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0},
                          {'ex': {'availableToBack': [{'price': 5.2,
                                                       'size': 9136.62}],
                                  'availableToLay': [{'price': 5.3,
                                                      'size': 5361.48}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 5.3,
                           'selectionId': 58805,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0}],
              'runnersVoidable': False,
              'status': 'OPEN',
              'totalAvailable': 1039329.11,
              'totalMatched': 645229.98,
              'version': 2045792715},
             {'betDelay': 0,
              'bspReconciled': False,
              'complete': True,
              'crossMatching': True,
              'inplay': False,
              'isMarketDataDelayed': True,
              'lastMatchTime': '2018-02-12T10:25:33.842Z',
              'marketId': '1.139782182',
              'numberOfActiveRunners': 3,
              'numberOfRunners': 3,
              'numberOfWinners': 1,
              'runners': [{'ex': {'availableToBack': [{'price': 2.22,
                                                       'size': 148.27}],
                                  'availableToLay': [{'price': 2.32,
                                                      'size': 10.1}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 2.3,
                           'selectionId': 18567,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0},
                          {'ex': {'availableToBack': [{'price': 3.8,
                                                       'size': 76.9}],
                                  'availableToLay': [{'price': 3.9,
                                                      'size': 20.57}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 3.85,
                           'selectionId': 62683,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0},
                          {'ex': {'availableToBack': [{'price': 3.2,
                                                       'size': 21.19}],
                                  'availableToLay': [{'price': 3.5,
                                                      'size': 85.41}],
                                  'tradedVolume': []},
                           'handicap': 0.0,
                           'lastPriceTraded': 3.25,
                           'selectionId': 58805,
                           'status': 'ACTIVE',
                           'totalMatched': 0.0}],
              'runnersVoidable': False,
              'status': 'OPEN',
              'totalAvailable': 39526.8,
              'totalMatched': 1715.46,
              'version': 2044817355}]}]
for response in output:  # loop over the JSONRPC responses
    for market in response['result']:   # each is a market
        print(market['marketId'])
        for runner in market['runners']:
            print(runner['selectionId'])
            for entry in runner['ex']['availableToBack']:
                print(entry['price'])
            for entry in runner['ex']['availableToLay']:
                print(entry['price'])
1.139185909
55190
1.39
1.4
1703
10.5
11.0
58805
5.2
5.3
1.139782182
18567
2.22
2.32
62683
3.8
3.9
58805
3.2
3.5