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

2024-05-21 21:29:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个元组的列表:

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)]

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

^{pr2}$

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

背景信息:我试图合并两个棒球统计的CSV文档,但是包含所有相关统计信息的CSV文档不包含球员姓名,只有一个参考号,例如“ansoc101”,而第二个文档的一列包含参考号,另一列包含对应球员的姓和名。在

CSV的大小太大了,无法手动完成这项工作(大约20000名玩家),所以我正在尝试自动化这个过程。在


Tags: csv文档信息元素列表rc1玩家元组
3条回答

您可以先创建一个字典来快速查找ID号,然后通过列表理解将两个列表中的数据非常有效地合并在一起:

import operator

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')]

id = operator.itemgetter(0)  # To get id field.

idinfo = {id(rec): rec[1:] for rec in idmatch}  # Dict for fast look-ups.

merged = [info + idinfo[id(info)] for info in playerinfo if id(info) in idinfo]

print(merged) # -> [('ansonca01', 4, 1871, 1, 'RC1', 'Anson', 'Cap', '05/06/1871')]

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

[x + y[1:] for x in list1 for y in list2 if x[0] == y[0]]

我在单子上试过了:

^{pr2}$

得到了:

[('this', 1, 2, 3, 5, 6, 7), ('that', 1, 2, 3, 10, 11, 12)]

这就是你想要的吗?在

字典

  1. 迭代playerinfolist并创建字典,其中key是元组中的第一个项,value是所有项的列表。在
  2. 打印第一步的结果。在
  3. 再次迭代idmatch列表并检查结果字典中元组的第一项。若存在,则使用列表扩展方法用新值扩展键的值。在
  4. 打印第二步的结果。在
  5. 从生成的词典创建输出格式。在

演示:

import pprint

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")]

result = {}
for i in playerinfo:
    result[i[0]] =  list(i[:])

print "Debug Rsult1:"
pprint.pprint(result)

for i in idmatch:
    if i[0] in result:
        result[i[0]].extend(list(i[1:])) 

print "\nDebug Rsult2:"
pprint.pprint(result)

final_rs = []
for i,j in result.items():
    final_rs.append(tuple(j))

print "\nFinal result:"

pprint.pprint(final_rs)

输出:

^{pr2}$

相关问题 更多 >