You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何校验嵌套列表中元素是否一致(井字棋胜负判定场景)

错误原因分析

你遇到的TypeError: 'bool' object is not iterable报错确实是any(winner)的用法错误:

  • any()接收一个可迭代对象作为参数,返回值是布尔类型(只要可迭代对象里有一个元素为真就返回True,否则返回False)
  • 你把any(winner)的返回值放到for elem in ...的位置,相当于尝试遍历布尔值,自然会触发类型错误。
最优实现方案

井字棋总共只有8种获胜组合,最优方案是提前把所有获胜线的索引定义为全局常量,每次判断时直接遍历所有获胜线校验即可,逻辑简洁性能也最优。

完整可运行代码

# 全局常量:所有获胜线对应的棋盘索引,仅需定义一次
WIN_LINES = [
    [0, 1, 2], [3, 4, 5], [6, 7, 8], # 横向获胜线
    [0, 3, 6], [1, 4, 7], [2, 5, 8], # 纵向获胜线
    [0, 4, 8], [2, 4, 6] # 斜向获胜线
]

def win_check(board, mark):
    """
    判定当前玩家是否获胜
    :param board: 长度为9的列表,代表3*3棋盘的落子状态
    :param mark: 当前玩家的标记,比如'X'或'O'
    :return: 获胜返回True,否则返回False
    """
    # 只要任意一条获胜线的所有位置都是当前玩家标记,即判定获胜
    return any(all(board[idx] == mark for idx in line) for line in WIN_LINES)

用法示例

# 示例棋盘:X玩家横向第一行满子
board = ['X', 'X', 'X', 'O', '', 'O', '', '', '']
print(win_check(board, 'X')) # 输出True
print(win_check(board, 'O')) # 输出False

逻辑说明

你原来的三层嵌套列表结构可以直接合并为一层的获胜线列表,不需要分横、竖、斜三个维度存储,用any()嵌套all()的语法可以一行完成所有获胜线的校验:

  • 内层all(board[idx] == mark for idx in line):判断单条获胜线是否全为当前玩家标记
  • 外层any( ... for line in WIN_LINES):判断8条获胜线中是否存在至少一条满足获胜条件

内容的提问来源于stack exchange,提问作者user6248190

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:30:01