Python如何从大型JSON中按指定键值快速提取目标字段?
如何快速从大型JSON数组中获取指定条目标段值?
我有一个包含上千条数据的大型JSON数组,需要从中获取2条指定条目里quotes->ASK->time字段的值。已知目标条目的name和symbol键值对,但不知道它们在数组中的位置。目前用遍历数组的方法能实现,但只拿2个值的话效率太低,想问问有没有不用循环遍历全部条目、能直接像parsed["symbol":"kalo"]["quotes"]["ASK"]["time"]这种方式直接取值的办法。
示例代码
x = requests.get('http://example.org/data.json') parsed = x.json() gettime= str(parsed[0]["quotes"]["ASK"]["time"]) print(gettime)
示例JSON结构
[ { "id": "nem-cri", "name": "nemlaaoo", "symbol": "nem", "rank": 27, "owner": "marcel", "quotes": { "ASK": { "price": 19429, "time": 319250866, "duration": 21 } } }, {"id": "kalo-lo-leek", "name": "kalowaaa", "symbol": "kalo", "rank": 122, "owner": "daniel", "quotes": {"ASK": {"price": 12928, "time": 937282932, "duration": 9}}}, {"id": "reewmaarwl", "name": "reeqooow", "symbol": "reeq", "rank": 4, "owner": "eric", "quotes": {"ASK": {"price": 9989, "time": 124288222, "duration": 19}}}, {"id": "sharkooaksj", "name": "sharkmaaa", "symbol": "shark", "rank": 22, "owner": "eric", "quotes": {"ASK": {"price": 11122, "time": 482773882, "duration": 22}}} ]
解决方案
首先明确:不存在直接通过parsed["symbol":"kalo"]这种语法直接取值的方法,因为原始数据是数组结构,不是以symbol为键的字典。要实现快速查找,最优方案是先把数组转换成以目标键(或键组合)为索引的字典,后续就能直接O(1)时间取值。
方法1:以symbol为键构建映射字典
如果symbol在数组中是唯一的,可以用它作为键构建字典,只需要遍历一次数组,之后就能直接取值:
import requests x = requests.get('http://example.org/data.json') parsed = x.json() # 一次性遍历数组,构建symbol到条目映射 symbol_map = {item['symbol']: item for item in parsed} # 直接获取指定symbol的time值 kalo_time = symbol_map['kalo']['quotes']['ASK']['time'] nem_time = symbol_map['nem']['quotes']['ASK']['time'] print(kalo_time, nem_time)
方法2:以name+symbol组合为键构建映射字典
如果symbol可能存在重复,用(name, symbol)组合作为键,确保唯一性:
import requests x = requests.get('http://example.org/data.json') parsed = x.json() # 构建name+symbol组合到条目的映射 name_symbol_map = {(item['name'], item['symbol']): item for item in parsed} # 通过name和symbol组合获取目标time值 target_time = name_symbol_map[('kalowaaa', 'kalo')]['quotes']['ASK']['time'] print(target_time)
补充说明
- 第一次构建映射字典必须遍历一次数组,但这是不可避免的——因为原始数据是无序数组,系统无法直接定位到指定条目。但遍历一次后,后续不管取多少个值都能直接获取,比每次需要取值都遍历数组高效得多。
- 如果你只需要取2个值,虽然还是要遍历一次数组,但这是当前场景下的最优解,没有更高效的方式了。
内容的提问来源于stack exchange,提问作者MickyB
相关产品推荐
相关产品推荐

