Самый быстрый способ обработки вложенных словарей - PullRequest
0 голосов
/ 07 ноября 2018

Я новичок в python и пытаюсь изучить лучшие способы написания очень быстрого кода. Я работаю над упражнением по обработке вложенных словарей, и вот словарь, с которым я работаю:

{
    "key_1": [
        {
            "title": <title>,
            "date": <date>,
            "text": <text>
        }
    ],
    "key_2": [
        {
             "title": <title>,
            "date": <date>,
            "text": <text>
        }
     ],
    "key_3": [
            {
                 "title": <title>,
                "date": <date>,
                "text": <text>
            }
     ]
}

Вот код, который я написал для доступа к нему. Но так как у меня есть три вложенных цикла, я не думаю, что это так быстро, как могло бы быть:

for main_key, main_value in dictionary.items():
    if main_value:
        for value in main_value:
            for sub_keys, sub_values in value.items():
                if sub_keys == "date":
                   print(sub_values)

Есть какие-нибудь указатели о том, как сделать мой код более кратким и быстрым? Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

вы можете создать функцию и вернуть значение:

>>> def get_value(key1, key2=None):
...     if key1 and key2:
...         try:
...             return my_dict.get(key1).get(key2)
...         except Exception as e:
...             print(e)
...             return None
...     else:
...         return my_dict(key1)

И я вижу в вашем коде, что вы хотите получить доступ только к ключу date. Вы можете сделать, как показано ниже:

>>> for x in my_dict:
...     print(my_dict[x].get('date'))

Это самое быстрое, что вы можете сделать. Поскольку сложность доступа к значению словаря по времени равна o (1).

0 голосов
/ 07 ноября 2018

Несколько баллов:

  1. Переменная main_key из вашего основного цикла не используется, поэтому вы можете просто перебрать dictionary.values().
  2. Оператор if main_value: является избыточным, поскольку следующий цикл for не будет повторяться, если main_value все равно будет пустым.
  3. Внутренний цикл над value.items() не нужен, потому что все, что он делает, - это находит ключ date в диктанте value и печатает его значение, чего можно достичь, просто используя квадратные скобки для доступа к value продиктовать ключом date. Поместите вокруг него блок try, чтобы игнорировать отсутствующий ключ date, потому что именно так ведет себя ваш текущий код.

С учетом приведенных выше пунктов ваш код должен выглядеть следующим образом:

for main_value in dictionary.values():
    for value in main_value:
        try:
            print(value['date'])
        except KeyError:
            pass
...