有没有一种方法可以在Python中内部连接两个字典列表?

有没有一种方法可以在Python中内部连接两个字典列表?,python,dictionary,join,python-3.7,Python,Dictionary,Join,Python 3.7,我想知道是否有一种方法可以将这两个字典列表作为“id”键的内部连接进行连接。我是Python新手,不知道该怎么做。这两个列表的列数必须相同,但行数可以是任意的。假设每个列表中的第一个“列”是要加入的键 employees = [{"id": 1, "name": "Steve"}, {"id": 2, "name": "Craig"},

我想知道是否有一种方法可以将这两个字典列表作为“id”键的内部连接进行连接。我是Python新手,不知道该怎么做。这两个列表的列数必须相同,但行数可以是任意的。假设每个列表中的第一个“列”是要加入的键

employees = [{"id": 1, "name": "Steve"},
             {"id": 2, "name": "Craig"},
             {"id": 3, "name": "James"},
             {"id": 10,"name": "Joseph"}]
sports =    [{"id": 1, "sport": "Basketball"},
             {"id": 1, "sport": "Tennis"},
             {"id": 2, "sport": "Basketball"},
             {"id": 3, "sport": "Basketball"},]

# I need to return a new list of dicts that will have values as the following: 
# innerJoined = [{"id": 1, "name": "Steve", "sport": "Basketball"},
#                {"id": 1, "name": "Steve", "sport": "Tennis"},
#                {"id": 2, "name": "Craig", "sport": "Basketball"},
#                {"id": 3, "name": "James", "sport": "Basketball"}]
#

您可以尝试迭代第一个列表,然后对每一行使用“id”键,查看它在第二个列表中与多少其他项匹配(使用第二个嵌套for循环)。对于每个匹配,将第一个列表中的dict与第二个列表中的匹配dict连接起来,并将它们附加到结果列表中。这当然是一个O(n^2)解


为了改进这一点,如果您知道这两个列表将始终按“id”排序,那么您可以保留一个计数器,跟踪您浏览第二个列表的距离,然后从那里开始第二个嵌套for循环的下一次运行。

以下是pythonic方法:

代码:

输出:

[{'id': 1, 'sport': 'Basketball', 'name': 'Steve'}, 
{'id': 1, 'sport': 'Tennis', 'name': 'Steve'}, 
{'id': 2, 'sport': 'Basketball', 'name': 'Craig'}, 
{'id': 3, 'sport': 'Basketball', 'name': 'James'}]

如果你想要一个数据库,你可能应该使用一个数据库。鉴于您描述问题时使用的术语,我假设您对它们有基本的了解。@KarlKnechtel我了解如何在数据库中执行此操作,但问题要求我们在不使用数据库的情况下执行此操作。只有在没有导入外部库的python中,“这个问题要求我们在不使用数据库的情况下这样做”——这是家庭作业吗?招聘挑战?编程测试?“假设每个列表中的第一个“列”是要连接的键”-在许多Python版本中都没有“第一列”。在Python3.7之前,dict是无序的,并且没有保留插入顺序。如果出于上述原因将joins键定义为“id”而不是“first key”,那么问题就简单了。“运动”有两个id为1的项目。那是打字错误吗?
[{'id': 1, 'sport': 'Basketball', 'name': 'Steve'}, 
{'id': 1, 'sport': 'Tennis', 'name': 'Steve'}, 
{'id': 2, 'sport': 'Basketball', 'name': 'Craig'}, 
{'id': 3, 'sport': 'Basketball', 'name': 'James'}]