python - 如何将嵌套字典与另一个嵌套字典组合,但前提是每个字典都具有匹配值?

标签 python json python-3.x dictionary nested

描述我想要实现的目标的最佳方式是引用 SQL 函数 INNER JOIN 的运行方式。适用于显示来自两个表的数据,由匹配的列名确定。

我想实现一个类似的功能,虽然通过使用 Python(最好是 3.x),而不是具有匹配列名的表,我想将两个字典的整体组合在一起,基于匹配 {k: v} 对。

例如……

lst_1 = [
    {
        'City'      :   'Boston',
        'State'     :   'Massechusets',
        'Name'      :   'Kim Tuttles',
        'Country'   :   'United State'
    },
    {
        'City'      :   'Portland',
        'Name'      :   'Larry Bird',
        'State'     :   'Oregon'
    },
    {
        'City'      :   'Chicago',
        'Name'      :   'John Jacobs',
        'State'     :   'Illinois'
    }
]

lst_2 = [
    {
        'Hobby'     :   'Tennis',
        'Build'     :   'Athletic',
        'Height'    :   'Six Feet, One Inch',
        'Name'      :   'Kim Tuttles',
        'Birthplace':   'Italy'
    },
    {
        'Name'      :   'John Jacobs',
        'Hobby'     :   'Baseball',
        'Build'     :   'Muscular',
        'Height'    :   'Five Feet, Eight Inches'
    }
]

我想找到一种方法来合并每个列表中的字典,但仅限于找到匹配的 {Key: Value} 对的地方。结果看起来像这样......

merged_lst = [
    {
        'Hobby'     :   'Tennis',
        'Build'     :   'Athletic',
        'Height'    :   'Six Feet, One Inch',
        'Birthplace':   'Italy'
        'City'      :   'Boston',
        'State'     :   'Massechusets',
        'Name'      :   'Kim Tuttles', # Merge on matching name
        'Country'   :   'United State'
    },
    {
        'Name'      :   'John Jacobs', # Merge on matching name
        'Hobby'     :   'Baseball',
        'Build'     :   'Muscular',
        'Height'    :   'Five Feet, Eight Inches'
        'City'      :   'Chicago',
        'State'     :   'Illinois'
    }
]

我设法找到了一种使用 dict.update 合并字典的方法和 zip() ,尽管那只是在处理两个独立的词典时,但仍然不太正确。感谢您提出任何建议,并提前致谢。

最佳答案

在 Python 3.5+ 中,我们可以避开以下问题,忽略额外的键冲突问题。

k = 'Name'
merged_lst = [{**a, **b} for a in lst_1 for b in lst_2 if a[k]==b[k]]
  • {**a, **b} 是将被考虑的两个字典解压缩到组合字典中的一种巧妙方法(我相信在冲突中它使用来自 b 的值 而不是 a)。这是唯一需要 3.5+ 的步骤。在带有 string 键的 Python 2.x 中,一个类似的结构是 dict(a, **b),尽管 Guido 对此皱眉。其他选项更详细。
  • Python 列表推导式允许您通过两次使用 for 轻松迭代 lst_1lst_2 的有效笛卡尔积。<
  • 我们只关心具有相同 'Name' 的字典,因此 a[k]==b[k] 位。
  • 如果允许您破坏 lst_1lst_2 中的任何词典,涉及 dict.update() 的方法可能更快。无论如何,它们可能是,尽管我认为语法没有那么好。

关于python - 如何将嵌套字典与另一个嵌套字典组合,但前提是每个字典都具有匹配值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51646529/

相关文章:

python - scipy ode 将函数集内的 set_f_params 更新为 set_solout

python - 如何在 NumPy 中构建这个简单的向量

json - 将 JSON 转换为 grails 对象

java - 当服务器返回错误时,使用 Immutables 进行改造会引发运行时异常

python - 根据 Bokeh 散点图中 ColumnDataSource 中的值设置颜色

python - Rust 等价于 Python 的 ljust() 字符串方法

python - 无法在 Windows 的 Linux 子系统中安装 Google-Earth-Engine-Api

json - Postgresql json 列表值提取

python - 计算 n 个列表的所有可能组合的总和并检查与特定值的比较

python-3.x - 如何在python中直接显示ADB截图?