如果第一个元组元素匹配,如何合并列表中的两个元组?

re_*_*138 2 python csv tuples list

我有两个以下形式的元组列表:

playerinfo = [(ansonca01,4,1871,1,RC1),(forceda01,44,1871,1,WS3),(mathebo01,68,1871,1,FW1)]

idmatch = [(ansonca01,Anson,Cap,05/06/1871),(aaroh101,Aaron,Hank,04/13/1954),(aarot101,Aaron,Tommie,04/10/1962)]
Run Code Online (Sandbox Code Playgroud)

我想知道的是,如何迭代两个列表,如果“playerinfo”元组中的第一个元素与“idmatch”元组中的第一个元素匹配,则将匹配的元组合并在一起以生成新列表元组?形式为:

merged_data = [(ansonca01,4,1871,1,RC1, Anson,Cap,05/06/1871),(...),(...), etc.] 
Run Code Online (Sandbox Code Playgroud)

新的元组列表的 ID 号将与正确玩家的名字和姓氏相匹配。

背景信息:我正在尝试合并两个棒球统计数据的 CSV 文档,但包含所有相关统计数据的文档不包含球员姓名,仅包含参考编号,例如“ansoc101”,而第二个文档包含以下参考编号:一列是相应玩家的名字和姓氏,另一列是相应玩家的名字和姓氏。

CSV 的大小太大,无法手动执行此操作(大约 20,000 个玩家),因此我尝试自动化该过程。

Sam*_*Sam 6

使用列表理解来迭代列表:

[x + y[1:] for x in list1 for y in list2 if x[0] == y[0]]
Run Code Online (Sandbox Code Playgroud)

我在列表中尝试过这个:

list1 = [("this", 1, 2, 3), ("that", 1, 2, 3), ("other", 1, 2, 3)]
list2 = [("this", 5, 6, 7), ("that", 10, 11, 12), ("notother", 1, 2, 3)]
Run Code Online (Sandbox Code Playgroud)

并得到:

[('this', 1, 2, 3, 5, 6, 7), ('that', 1, 2, 3, 10, 11, 12)]
Run Code Online (Sandbox Code Playgroud)

这就是你想要的吗?

  • 实际上,这个解决方案虽然简洁,但效率相当低。我忘了您说过您正在处理大约 20,000 个项目。这种理解会进行 20,000 x 20,000 次比较,即太多了。使用字典的其他解决方案对于大型数据集来说“要好得多”。 (2认同)