python - 列表理解和扁平化深层数据结构

标签 python list-comprehension flatten

假设我有一个如下所示的数据结构(这已大大简化,我的实际数据对于每个日期的每个作业都有大量特定于日期的数据):

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.'}
    }
}

我想做的就是将其展平,将日期作业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...})

但是有没有一种更Pythonic/更有效的方法来使用列表理解和这样的嵌套数据来做到这一点?我能想到的就是对内部循环使用列表理解,然后使用 extend 来构建列表,而不是附加。想法?

最佳答案

一个可能的列表理解解决方案可能如下,我们解压 job 字典并向其中添加 iddate 键值对,同时迭代两个 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})

关于python - 列表理解和扁平化深层数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56819882/

相关文章:

c++ - 编写 Virtualbox 脚本以创建网络

python - 带有 Eclipse 的 TensorFlow

python - 如果项目数量未知,如何计算此展平数组函数的运行时复杂度?

java - 在 Guava 中展平一个 Iterable<Iterable<T>>

Python Pandas 按多列分组

python - 在 MxNet-Gluon 中将 ROIPooling 层与预训练的 ResNet34 模型结合使用

python - 为什么不打印字符串 'andy' 请输入新用户名?

python - Python 中惰性 for 理解的文档

list-comprehension - 我应该怎么称呼一个列出推导式的 REBOL 函数?

iphone - 如何将 'Flatten' 多个 UIImageView 合并为一个?