Python 列表中的匹配
我正在做一个棒球项目,我正在尝试将来自两个不同csv文件的运动员姓名与其相应的统计数据进行匹配 例如,我有两个列表,如下所示:Python 列表中的匹配,python,list,Python,List,我正在做一个棒球项目,我正在尝试将来自两个不同csv文件的运动员姓名与其相应的统计数据进行匹配 例如,我有两个列表,如下所示: player_stats1 = [[Clayton Kershaw, stats, more stats, more stats]] player_stats2 = [[Clayton Kershaw, stats, more stats, more stats]] 我有一个if语句来检查这两个名称是否相同 if player_stats1[1][1] and pl
player_stats1 = [[Clayton Kershaw, stats, more stats, more stats]]
player_stats2 = [[Clayton Kershaw, stats, more stats, more stats]]
我有一个if语句来检查这两个名称是否相同
if player_stats1[1][1] and player_stats1[1][2] == player_stats2[1][1] and player_stats2[1][2]:
print('True')
else:
print('false')
我需要检查姓名是否相同,是否将players_stats2[1][0]和players_stats2[1][5]的数据附加到原始列表players_stats1
我试过了
length1 = len(player_stats1)
players_stats3 = []
i = 1
while i < length1:
if player_stats1[1][i] and player_stats1[1][i + 1] == player_stats2[1][i] and player_stats2[1][i + 1]:
players_stats3.append(player_stats2[i][0], player_stats2[i][5])
else:
print('')
i += 1
在i
:因为长度将是4,但您只有列表索引,最多只能有[3]
length1 = len(player_stats1)
然后使用:
player_stats1[1][i]
你怎么知道玩家_stats1[1][i]存在
你不应该:
length1 = len(player_stats1[1])
其他:
length1 = len(player_stats1)
players_stats3 = []
i = 1
while i < length1:
if player_stats1[i][1] and player_stats1[i][2] == player_stats2[i][1] and player_stats2[i][2]:
players_stats3.append(player_stats2[i][0], player_stats2[i][5])
else:
print('')
i += 1
length1=len(玩家状态1)
球员人数3=[]
i=1
而我
这是假设player_stats1和player_stats2的长度相同。不过,总的来说,这似乎是一个错误的解决方案。
您应该从一个csv中创建一个键/值对,并对照另一个进行检查,因为在这个解决方案中,如果您有一个顺序错误的匹配播放器,您将找不到它。您有一个列表。所以,改变你的索引方式
# get the i-th list of player stats | [Clayton Kershaw, stats, more stats, more stats]
player_stats1[i]
# get the name in the i-th list of player stats
player_stats1[i][1]
在本例中,您将玩家名称作为第一项,因此如果这是正确的,则应按照以下步骤获取名称
player_stats1[i][0]
范例
>>> lsts = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
>>> lsts[0][1] # first list, second item
2
您原来的if语句也有问题
if player_stats1[1][1] and player_stats1[1][2] == player_stats2[1][1] and player_stats2[1][2]:
print('True')
else:
print('false')
如果两个列表都包含“truthy”值,则始终打印True。相反,您需要对两者进行比较
player_stats1[1][1] == player_stats2[1][1] and player_stats1[1][2] == player_stats2[1][2]
备选方案:
您还可以使用zip
将列表分组在一起,并同时对这两个列表进行迭代
player_stats1 = [ ["A", "B"], ["A", "C"], ["D", "A"], ["E", "E"]]
player_stats2 = [ ["A", "A"], ["D", "A"], ["A", "C"], ["E", "E"]]
res = []
for p1, p2 in zip(player_stats1, player_stats2):
if p1[0] == p2[0] and p1[1] == p2[1]:
res.append( (p2[0], p2[1]) )
print(res)
zip的缺点是:
你的列表应该是同一面的,否则较小的将是拉链的最终长度,因为你将无法与较长列表的其余部分配对
这只会将它们与相应索引处的项目进行比较
如果您想找到所有匹配项,那么您将需要循环两个匹配项,并比较它们中的每一个
res = []
for p2 in player_stats1:
for p1 in player_stats2:
if p1[0] == p2[0] and p1[1] == p2[1]:
res.append( (p2[0], p2[1]) )
print(res)
我尝试过这样做,但0索引是csv文件中的所有标题,它仍然会给我相同的错误尝试更改,而我
:因为长度将为4,但您只有[3]的列表索引
即使您在检查时,我
将i
限制为player\u stats1
的长度,但[i+1]
最终将超过player\u stats1
的长度,给出错误
是否可以使用类似enumerate的方法?当然可以使用enumerate,但这可能无助于避免该错误。也许将循环放入尝试
/除
之外,并处理索引器
异常可能更有效。我有多个列表,每个列表有18列。玩家_stats1[1]只给我第一个玩家和他的所有状态,然后你的while循环是错误的,而我res = []
for p2 in player_stats1:
for p1 in player_stats2:
if p1[0] == p2[0] and p1[1] == p2[1]:
res.append( (p2[0], p2[1]) )
print(res)