绕过 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"])