首页 > 解决方案 > 如何比较Python中不同列表的第n个元素?

问题描述

我正在制作一个井字游戏,其中输入决定了棋盘的大小(让它变得有趣)。有两个玩家,玩家 1 使用 X,玩家 2 使用 O 来标记他们在棋盘上的位置。

3 x 3 板的代码如下所示:(我想将板制作代码替换为一些硬编码较少的东西,但我现在很好,这不是问题,这只是为了澄清)

grid = "-  -  -\n-  -  -\n-  -  -"                                           
print(grid)                                                                  
                                                                             
listed_grid = list(grid)                                                     
while "\n" in listed_grid:                                                   
    listed_grid.remove("\n")                                                 
while " " in listed_grid:                                                    
    listed_grid.remove(" ")                                                  
listed_grid = [listed_grid[n: n + 3] for n in range(0, len(listed_grid), 3)] 
print(listed_grid)  

                                                     

所以基本上我有 x 个相同长度的列表(x 也由输入和长度决定)。这些列表代表棋盘的行。(我知道在上面的代码中它没有被决定为输入)

我希望代码打印一条消息,上面写着“恭喜!玩家 A(1 或 2)赢了!!!” 当对于每个列表时,每个列表的第 n 个元素都是相同的。实际上,在这种情况下,有一整列被相同的标记类型(X 或 O)占据。

因此,如果列表“listed_grid”是经典的 3x3 游戏,则每行有 3 个子列表。我该如何做到这一点,对于“listed_grid”中子列表中的每个第 n 个元素,如果标记相同而不是“-”(连字符),因为连字符只是向玩家显示该位置没有被占用,它会打印一个祝贺谁赢了?

非常感谢!请对我放轻松,我在 Python 方面仍然很糟糕。

标签: pythonlist

解决方案


要检查您可以使用的列zip(),这将为您提供tuple包含这些列的 s 列表。您可以将结果插入set()并检查是否只有一个元素并且它不是-

for col in zip(*listed_grid):
    s = set(col)
    if len(s) == 1:
        x = s.pop()
        if x != '-':
            print(f'Congratulations! Player {x} won!!!')

或者,如果您使用 Python 3.8 或更新版本,您可以使用赋值表达式 :=

for col in zip(*listed_grid):
    s = set(col)
    if len(s) == 1 and (x := s.pop()) != '-':
        print(f'Congratulations! Player {x} won!!!')

输出:

grid = "-  Y  -\nX  Y  -\nX  Y  -"
# Congratulations! Player Y won!!!

grid = "X  Y  -\nX  Y  -\nX  -  -"
Congratulations! Player X won!!!

推荐阅读