在列表中匹配

2024-06-16 14:08:29 发布

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

我正在做一个棒球项目,我正在尝试将两个不同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  player_stats1[1][2] == player_stats2[1][1] and player_stats2[1][2]:
    print('True')
else: 
    print('false')

我需要检查名称是否相同,以及它们是否附加了来自players_stats2[1][0] and players_stats2[1][5] to the original list, 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

但我总是出错

IndexError: list index out of range

Tags: andifmorestats名字elselistplayer
3条回答

你有

length1 = len(player_stats1)

但使用:

player_stats1[1][i]

你怎么知道玩家\u 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

这是假设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的缺点是:

  1. 你的列表应该是同一边的,否则较小的那一个将是拉链的最终长度,因为你将无法与较长列表的其余部分配对
  2. 这只会将它们与相应索引处的项进行比较

如果你想找到所有的匹配,那么你将需要通过两个循环来比较每一个

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)

更改while i < length1 -1:因为长度将是4,但列表索引最多只有[3]

相关问题 更多 >