我正在通过API连接并提取JSON,但是无法进行解析。
我已经能够解析到以下示例级别。我想从生成的JSON列表中提取“符号”列表,但似乎只能对单个实体执行此操作。如果可能的话,我想直接这样做(即避免只使用循环)。
也就是说,这可行:
data[0]['acct']['positions'][1]['i']['symbol']
返回此:
Out[100]: 'JNC'
但这并没有:
data[0]['acct']['positions'][:]['i']['symbol']
data[0]['acct']['positions'][0:3]['i']['symbol']
均返回以下错误:
Traceback (most recent call last):
File "<ipython-input-105-72bbee303a08>", line 1, in <module>
data[0]['securitiesAccount']['positions'][:]['instrument']['symbol']
TypeError: list indices must be integers or slices, not str
下面的示例JSON:
[{'a': 0.0,
'b': 1.0,
'i': {'desc': 'CASH_EQUIVALENT', 'id': '9ZZZFD104', 'symbol': 'MMDA1'},
'c': 72.64},
{'a': 0.0,
'b': 33.61716,
'i': {'desc': 'EQUITY', 'id': '78464A417', 'symbol': 'JNC'},
'c': 39.59},
{'a': 0.0,
'b': 87.81473,
'i': {'desc': 'EQUITY', 'id': '921937793', 'symbol': 'BVV'},
'c': 19.34}]
答案 0 :(得分:3)
这种索引无法像NumPy中那样工作。您可以改用列表理解:
result = [record['i']['symbol'] for record in data[0]['acct']['positions'][0:3]]
很显然,将[0:3]
更改为任何值。如果要全部使用,则完全省略该切片。
这是您最初尝试执行的操作:
假设您有一个字典列表,如下所示:
foo = [{'bar': 1}, {'bar': 2}, {'bar': 3}]
如果您想使用自己的方法访问[1, 2, 3]
,则类似于foo[:]['bar']
。但是,此表达式是从左到右求值的,foo[:]
只会创建foo
的一部分,实际上什么也没做。然后,您尝试从'bar'
(列表)中获取密钥foo
,这将引发错误。
答案 1 :(得分:2)
您可以使用列表推导来返回过滤后的列表。
代替
data[0]['acct']['positions'][:]['i']['symbol']
您可以使用:
[ i['i']['symbol'] for i in data[0]['acct'] ]
这会循环data[0]['act']
,并为每个['i']['symbol']
构造一个列表。
对于列表的子部分,您可以使用:
[ i['i']['symbol'] for i in data[0]['acct'][0:3] ]
对此进行修改以与您的示例json一起使用:
data = [
{'a': 0.0,
'b': 1.0,
'i': {'desc': 'CASH_EQUIVALENT', 'id': '9ZZZFD104', 'symbol': 'MMDA1'},
'c': 72.64},
{'a': 0.0,
'b': 33.61716,
'i': {'desc': 'EQUITY', 'id': '78464A417', 'symbol': 'JNC'},
'c': 39.59},
{'a': 0.0,
'b': 87.81473,
'i': {'desc': 'EQUITY', 'id': '921937793', 'symbol': 'BVV'},
'c': 19.34}
]
print([ i['i']['symbol'] for i in data[0] ])
打印:
['MMDA1', 'JNC', 'BVV']