绕过 python 嵌套字典中的顶级键以提取低级键
Bypass top level keys in python nested dictionary to extract low level keys
我有一个复杂的嵌套字典。我想提取所有“符号”键。我已经尝试过提取所有值的函数,.get,转换为列表,元组,我知道我可以将它一点一点地分解,但我想知道什么是最有效、最不容易出错的解析方法 不调用顶级键。顶层密钥发生变化,因此创建函数来解决这些问题并不理想,并且有可能破坏代码,因此输入 symbol = map['2022-05-10:1']['303.0']['symbol']
不是我想要做的。
{'2022-05-16:1': {'300.0': [{'putCall': 'CALL',
'symbol': 'QQQ_051622C300',
'description': 'QQQ May 16 2022 300 Call',
'exchangeName': 'OPR',
'bid': 3.77,
'ask': 3.94,
'last': 3.86,
'mark': 3.86,
'bidSize': 78,
'askSize': 34,
'bidAskSize': '78X34',
'lastSize': 0,
'highPrice': 5.38,
'lowPrice': 2.17,
'openPrice': 0.0,
'closePrice': 4.19,
'totalVolume': 23707,
'tradeDate': None,
'tradeTimeInLong': 1652472847483,
'quoteTimeInLong': 1652472899026,
'netChange': -0.33,
'volatility': 26.028,
'delta': 0.602,
'gamma': 0.049,
'theta': -0.411,
'vega': 0.117,
'rho': 0.017,
'openInterest': 5828,
'timeValue': 1.92,
'theoreticalOptionValue': 4.19,
'theoreticalVolatility': 29.0,
'optionDeliverablesList': None,
'strikePrice': 300.0,
'nonStandard': False}],
'301.0': [{'putCall': 'CALL',
'symbol': 'QQQ_051622C301',
'description': 'QQQ May 16 2022 301 Call',
'exchangeName': 'OPR',
'bid': 3.23,
'ask': 3.35,
'last': 3.27,
'mark': 3.29,
...
获取嵌套字典中的所有 symbol
值,您可以使用下一个示例(dct
是问题中的字典):
print([i["symbol"] for d in dct.values() for v in d.values() for i in v])
打印:
['QQQ_051622C300', 'QQQ_051622C301', 'QQQ_051622C302', 'QQQ_051622C303']
编辑:如果缺少符号:
print(
[
s
for d in dct.values()
for v in d.values()
for i in v
if (s := i.get("symbol"))
]
)
如果这个结构是一致的,你可以使用:
# x is your dictionary
symbols = []
for date in x.values():
for i in date.values():
for j in i:
if "symbol" in j:
symbols.append(j["symbol"])
>>> symbols
['QQQ_051622C300',
'QQQ_051622C301',
'QQQ_051622C302',
'QQQ_051622C303']
如果您只想打印符号密钥而不是保存它,则只需删除 symbols = []
并将 symbols.append(j["symbol"])
替换为 print(j["symbol"])
。
我有一个复杂的嵌套字典。我想提取所有“符号”键。我已经尝试过提取所有值的函数,.get,转换为列表,元组,我知道我可以将它一点一点地分解,但我想知道什么是最有效、最不容易出错的解析方法 不调用顶级键。顶层密钥发生变化,因此创建函数来解决这些问题并不理想,并且有可能破坏代码,因此输入 symbol = map['2022-05-10:1']['303.0']['symbol']
不是我想要做的。
{'2022-05-16:1': {'300.0': [{'putCall': 'CALL',
'symbol': 'QQQ_051622C300',
'description': 'QQQ May 16 2022 300 Call',
'exchangeName': 'OPR',
'bid': 3.77,
'ask': 3.94,
'last': 3.86,
'mark': 3.86,
'bidSize': 78,
'askSize': 34,
'bidAskSize': '78X34',
'lastSize': 0,
'highPrice': 5.38,
'lowPrice': 2.17,
'openPrice': 0.0,
'closePrice': 4.19,
'totalVolume': 23707,
'tradeDate': None,
'tradeTimeInLong': 1652472847483,
'quoteTimeInLong': 1652472899026,
'netChange': -0.33,
'volatility': 26.028,
'delta': 0.602,
'gamma': 0.049,
'theta': -0.411,
'vega': 0.117,
'rho': 0.017,
'openInterest': 5828,
'timeValue': 1.92,
'theoreticalOptionValue': 4.19,
'theoreticalVolatility': 29.0,
'optionDeliverablesList': None,
'strikePrice': 300.0,
'nonStandard': False}],
'301.0': [{'putCall': 'CALL',
'symbol': 'QQQ_051622C301',
'description': 'QQQ May 16 2022 301 Call',
'exchangeName': 'OPR',
'bid': 3.23,
'ask': 3.35,
'last': 3.27,
'mark': 3.29,
...
获取嵌套字典中的所有 symbol
值,您可以使用下一个示例(dct
是问题中的字典):
print([i["symbol"] for d in dct.values() for v in d.values() for i in v])
打印:
['QQQ_051622C300', 'QQQ_051622C301', 'QQQ_051622C302', 'QQQ_051622C303']
编辑:如果缺少符号:
print(
[
s
for d in dct.values()
for v in d.values()
for i in v
if (s := i.get("symbol"))
]
)
如果这个结构是一致的,你可以使用:
# x is your dictionary
symbols = []
for date in x.values():
for i in date.values():
for j in i:
if "symbol" in j:
symbols.append(j["symbol"])
>>> symbols
['QQQ_051622C300',
'QQQ_051622C301',
'QQQ_051622C302',
'QQQ_051622C303']
如果您只想打印符号密钥而不是保存它,则只需删除 symbols = []
并将 symbols.append(j["symbol"])
替换为 print(j["symbol"])
。