Обход ключей верхнего уровня во вложенном словаре python для извлечения ключей низкого уровня

У меня есть сложный вложенный словарь. Я хочу извлечь все «символические» ключи. Я пробовал функции, извлекающие все значения, .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 значения или ключи?

Freddy Mcloughlan 16.05.2022 01:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Получите все значения 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 Обновлено.

Andrej Kesely 16.05.2022 01:32

хорошо, поэтому запускаем цикл для перебора каждого значения. Думаю, я думал, что может быть метод словаря для извлечения всех «символьных» ключей, таких как dct.getkeys («символ»), который был бы чище.

Spearhead 16.05.2022 09:44

Если эта структура непротиворечива, вы можете использовать:

# 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"]), если вы предпочитаете просто печатать ключ символа, а не сохранять его.

Другие вопросы по теме