描述我想要实现的目标的最佳方式是引用 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_1和lst_2的有效笛卡尔积。< - 我们只关心具有相同
'Name'的字典,因此a[k]==b[k]位。 - 如果允许您破坏
lst_1或lst_2中的任何词典,涉及dict.update()的方法可能更快。无论如何,它们可能是,尽管我认为语法没有那么好。
