检查一个列表是否存在于另一个列表中

时间:2020-07-06 21:36:33

标签: python list multidimensional-array

我正在使用tic tac toe应用程序,目前正在尝试弄清楚如何让计算机知道用户已经赢了。

我的方法是将用户占据的每个位置附加到“ x_moves”列表中,并对照“ win_if”列表进行检查,以查看x_moves列表是否包含任何顺序的任何组合。

win_if = (
["top_l", "top_m", "top_r"],
["mid_l", "mid_m", "mid_r"], 
["bot_l", "bot_m", "bot_r"],
["top_l", "mid_l", "bot_l"], 
["top_m", "mid_m", "bot_m"], 
["top_r", "mid_r", "bot_r"],
["top_l", "mid_m", "bot_r"], 
["top_r", "mid_m", "bot_l"]
)

x_moves = ["top_m", "mid_r", "mid_m", "bot_m"]

我尝试使用“ in”,但是这不起作用,因为x_moves列表需要按照非常特殊的顺序排列。

3 个答案:

答案 0 :(得分:1)

您可以获取win_if中的每个内部列表,并检查用户是否在内部移动。如果计数大于2(或等于3),则表示有赢家。像这样:

win_if = (
    ["top_l", "top_m", "top_r"],
    ["mid_l", "mid_m", "mid_r"],
    ["bot_l", "bot_m", "bot_r"],
    ["top_l", "mid_l", "bot_l"],
    ["top_m", "mid_m", "bot_m"],
    ["top_r", "mid_r", "bot_r"],
    ["top_l", "mid_m", "bot_r"],
    ["top_r", "mid_m", "bot_l"]
)

x_moves = ["top_m", "mid_r", "mid_m", "bot_m"]

for inner in win_if:
    count = 0
    for each in x_moves:
        if each in inner:
            count += 1
    if count > 2:
        print("winner")
        break

答案 1 :(得分:0)

我认为您可以编写一个简单的函数,例如:

编辑:您可以使用sets来获得结果。

def is_winner(test):
    win_if = [
        {"top_l", "top_m", "top_r"},
        {"mid_l", "mid_m", "mid_r"}, 
        {"bot_l", "bot_m", "bot_r"},
        {"top_l", "mid_l", "bot_l"}, 
        {"top_m", "mid_m", "bot_m"}, 
        {"top_r", "mid_r", "bot_r"},
        {"top_l", "mid_m", "bot_r"}, 
        {"top_r", "mid_m", "bot_l"}
    ]

    for win_possibility in win_if:

        if set(test) == win_possibility:
            return True
    return False

这有意义吗?

答案 2 :(得分:0)

一种更好的方法是将电路板表示为这样的2D矩阵

board = [[1, 2, 3], ['o', 'o', 'o'], [7, 8, 9]]
player_1 = 'x'
player_2 = 'o'
winner = None

# checks rows
def check_rows(board):
    for i in range(3):
        if board[i].count(board[i][0]) == len(board[i]):
            if board[i][0] == player_1:
                return 'player_1'
            elif board[i][0] == player_2:
                return 'player_2'
    return None

column = [[board[i][j] for i in range(3)] for j in range(3)]
diagonal_1 = [board[i][j] for i, j in enumerate(range(3))]
diagonal_2 = [board[i][j] for i, j in enumerate(range(2, -1, -1))]
winner = check_rows(board) or check_rows(column) or check_rows(diagonal_1) or check_rows(diagonal_2)
print(winner)

这将返回None,如果在当前董事会状态下没有获胜者,则它非常紧凑,并且仅对行,列和对角线使用一个函数。

board[i].count(board[i][0]) == len(board[i])检查矩阵中一行中的所有3个项目是否相等,这意味着两个玩家中的一个获胜,因此我们通过检查该行中的第一个项目来检查哪个获胜(因为它们都是相等的),并返回以字符串形式获胜的玩家。