Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表中的匹配_Python_List - Fatal编程技术网

Python 列表中的匹配

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

我正在做一个棒球项目,我正在尝试将来自两个不同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]和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)