У меня есть сложный вложенный словарь. Я хочу извлечь все «символические» ключи. Я пробовал функции, извлекающие все значения, .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"))
]
)
@FreddyMcloughlan Обновлено.
хорошо, поэтому запускаем цикл для перебора каждого значения. Думаю, я думал, что может быть метод словаря для извлечения всех «символьных» ключей, таких как dct.getkeys («символ»), который был бы чище.
Если эта структура непротиворечива, вы можете использовать:
# 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"])
, если вы предпочитаете просто печатать ключ символа, а не сохранять его.
Все
symbol
значения или ключи?