Получение всей информации из конкретных во вложенных словарях - PullRequest
0 голосов
/ 11 сентября 2018

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

Мои вложенные словари выглядят следующим образом:

dict_items = {
    "base_id": {
        "some-id-C03": {
            "index": 3, 
            "role": "admin", 
            "text": "test_A_02", 
            "data": {
                "comment": "A test", 
                "version": "1", 
                "created": "05/09/18 14:18", 
                "created_by": "John"
            }, 
            "type": "subTesting", 
        }, 
        "some-id-B01": {
            "index": 1, 
            "role": "admin", 
            "text": "test_B_02", 
            "data": {
                "comment": "B test",
                "version": "1", 
                "created": "05/09/18 14:16", 
                "created_by": "Pete"
            }, 
            "type": "subTesting", 
            "id": "33441122-b655-8877-ccddeeff88bb"
        },
        "some-id-A03": {
            "index": 1, 
            "role": "admin", 
            "text": "test_C_01", 
            "data": {
                "comment": "C test",
                "version": "1", 
                "created": "15/06/18 09:12", 
                "created_by": "Pete"
            }, 
            "type": "subTesting", 
            "id": "55667788-c122-8877-zzddff00bb11"
        }
    }
}

Пока я могу выполнить, используя:

for item in dict_items.get('base_id').values():
    print item['data']['created_date']

Как я могу сказать / добавить другую информацию, относящуюся к created_date, которую я запросил?

Например, я хотел получить последние 2 информации (используя модуль datetime), в этом случае он вернет мне всю информацию, которая принадлежит ключу - some-id-C03 и some-id-B01

Это ожидаемый вывод:

"some-id-C03": {
    "index": 3, 
    "role": "admin", 
    "text": "test_A_02", 
    "data": {
        "comment": "A test", 
        "version": "1", 
        "created": "05/09/18 14:18", 
        "created_by": "John"
    }, 
    "type": "subTesting", 
}, 
"some-id-B01": {
    "index": 1, 
    "role": "admin", 
    "text": "test_B_02", 
    "data": {
        "comment": "B test",
        "version": "1", 
        "created": "05/09/18 14:16", 
        "created_by": "Pete"
    }, 
    "type": "subTesting", 
    "id": "33441122-b655-8877-ccddeeff88bb"
}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Если я правильно понимаю, вы хотите иметь возможность запрашивать эту структуру данных таким образом, чтобы у вас были все записи, соответствующие некоторым критериям.

Я бы настроил это примерно так:

def query_dict_items(data_dict, condition_fn):
    '''
    Return a list containing the contents of `data_dict` for which 
    `condition_fn` returns `True`.
    '''

    results = []
    for data_item in data_dict['base_id'].values():
        if condition_fn(data_item):
            results.append(data_item)

    return results

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

from datetime import datetime

#   Define a condition function that matches items from Sept 5th, 2018.
sept_5 = datetime.strptime('05/09/18', '%d/%m/%y')
def was_on_sept_5(data_item):
    date_str = data_item['data']['created'].split(' ')[0]
    return datetime.strptime(date_str, '%d/%m/%y').date() == sept_5.date()

#   Print the resulting list.
from pprint import pprint
pprint(query_dict_items(dict_items, was_on_sept_5))

Надеюсь, это поможет вам двигаться в правильном направлении.

0 голосов
/ 11 сентября 2018

Вы можете все значения, связанные с клавишей "data", а затем сортировать по месяцу:

import datetime, re
def _sort_key(d):
  return list(map(int, re.findall('\d+', list(i.values())[0]['data']['created'])))

def get_data(d):
  _c = [[{a:b}] if 'data' in b else get_data(b) for a, b in d.items() if isinstance(b, dict) or 'data' in b]
  return [i for b in _c for i in b]


results = sorted(get_data(dict_items), key=_sort_key)[:2]

Вывод:

[{'some-id-C03': {'index': 3, 'role': 'admin', 'text': 'test_A_02', 'data': {'comment': 'A test', 'version': '1', 'created': '05/09/18 14:18', 'created_by': 'John'}, 'type': 'subTesting'}}, {'some-id-B01': {'index': 1, 'role': 'admin', 'text': 'test_B_02', 'data': {'comment': 'B test', 'version': '1', 'created': '05/09/18 14:16', 'created_by': 'Pete'}, 'type': 'subTesting', 'id': '33441122-b655-8877-ccddeeff88bb'}}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...