Понимание списка и выравнивание глубокой структуры данных - PullRequest
1 голос
/ 29 июня 2019

Допустим, у меня есть структура данных, которая выглядит следующим образом (это значительно упрощается, мои фактические данные содержат значительный объем данных за день для каждой работы на каждую дату):

data = {
    '2019-01-01': {
        'job-1-id': {'name': 'Job 1', 'address': '123 main st.'},
        'job-2-id': {'name': 'Job 2', 'address': '824 1st Ave.'},
    },
    '2019-01-02': {
        'job-1-id': {'name': 'Job 1', 'address': '123 main st.'},
        'job-3-id': {'name': 'Job 3', 'address': '485 Pleasant Rd.'}
    }
}

То, что я хотел бы сделать, это сгладить это, выдвинув date и job id к массиву объектов.Например:

data_flat = [
    {'id': 'job-1-id', 'date': '2019-01-01', 'name': 'Job 1', 'address': '123 main st.'},
    {'id': 'job-2-id', 'date': '2019-01-01', 'name': 'Job 2', 'address': '824 1st Ave.'},
    {'id': 'job-1-id', 'date': '2019-01-02', 'name': 'Job 1', 'address': '123 main st.'},
    {'id': 'job-3-id', 'date': '2019-01-02', 'name': 'Job 3', 'address': '485 Pleasant Rd.'},
]

Очевидно, что я могу просмотреть и построить новый массив:

data_flat = []
for date, jobs in data.items():
    for job_id, job in jobs.items():
        data_flat.append({'id': job_id, 'date': date, etc...})

Но есть ли более питонский / эффективный способ сделать это, используя понимание списка со вложенными данными, напримерэтот?Все, что я могу придумать, - это использовать понимание списка для внутреннего цикла, а затем вместо добавления использовать extend для построения списка.Мысли? * * 1013

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

плоский список можно легко сделать с помощью reduce.

Все, что вам нужно для использования инициализатор - третий аргумент в функции reduce.

reduce(
 lambda _list, date: _list.extend(
   {'date': date, 'id':_id, **detail} for _id, detail in data[date].items()) or _list, 
 data, 
 [])

Приведенный выше код работает как для python2, так и для python3, но вам нужно импортировать модуль Reduce как from functools import reduce.Для получения подробной информации см. Ссылку ниже.

0 голосов
/ 29 июня 2019

Возможное решение для понимания списка может быть следующим, где мы распаковываем словарь job и добавляем к нему пару ключ-значение id и date, перебирая по двум циклам for

[{**job, 'id': job_id, 'date': date} for date, jobs in data.items() for job_id, job in jobs.items()]

Что в традиционном цикле for выглядит как

for date, jobs in data.items():
    for job_id, job in jobs.items():
        data_flat.append({**job, 'id': job_id, 'date': date})
...