Python-chess:如何将Move对象列表转为字符串元素列表?
解决python-chess中的两个问题:Move排序报错与生成字符串列表
1. 解决Move对象排序的TypeError问题
你遇到的TypeError: '<' not supported between instances of 'Move' and 'Move',是因为python-chess的Move对象默认没实现比较运算符,直接对包含Move的元素排序会失败。
正确的做法是把legal_moves和move_evals配对成元组,基于评估值排序:
- 用
sorted()指定排序依据:
# 假设legal_moves是Move列表,move_evals是对应评估值列表 move_eval_pairs = list(zip(legal_moves, move_evals)) # 按评估值降序排序 sorted_pairs = sorted(move_eval_pairs, key=lambda x: x[1], reverse=True) # 拆分回排序后的结果 sorted_moves = [pair[0] for pair in sorted_pairs] sorted_evals = [pair[1] for pair in sorted_pairs]
- 也可以把评估值放在元组前,利用元组自然排序特性:
move_eval_pairs = [(eval, move) for move, eval in zip(legal_moves, move_evals)] sorted_pairs = sorted(move_eval_pairs, reverse=True) sorted_moves = [pair[1] for pair in sorted_pairs] sorted_evals = [pair[0] for pair in sorted_pairs]
2. 正确生成Move对象的字符串列表
list(str(legal_moves))会把整个列表的字符串表示拆成单个字符,这不是你要的结果。你需要遍历每个Move对象逐个转换:
- 用列表推导式生成UCI格式字符串(比如"e2e4"):
string_moves = [str(move) for move in legal_moves] # 或直接调用Move的uci()方法,效果一致 string_moves = [move.uci() for move in legal_moves]
- 如果需要代数记谱法(比如"e4"),要传入当前棋盘对象调用
san()方法:
# board是当前的chess.Board实例 string_moves = [board.san(move) for move in legal_moves]
内容的提问来源于stack exchange,提问作者user19770271
相关产品推荐
相关产品推荐

