Python字典如何使用多条件作为键?石头剪刀布代码异常排查
问题原因
你误用了Python的and逻辑运算符构造字典键:
- Python中
A and B的运算规则为:若A为真则返回B,否则返回A。你使用的所有出拳字符串都是非空真值,因此"paper" and "rock"这类写法的实际返回值是第二个字符串"rock",而非你预期的组合条件。 - 最终你的规则字典会被覆盖到仅剩3个有效键:
rock、paper、scissors,对应最后一次赋值的结果,因此输出完全不符合规则。
解决方案
使用元组作为字典的键,元组为不可变类型,支持作为字典键存储组合条件:
修改后的规则字典
table = { ("paper", "paper"): "Draw", ("paper", "rock"): "Win", ("paper", "scissors"): "You Lose", ("rock", "paper"): "You Lose", ("rock", "rock"): "Draw", ("rock", "scissors"): "Win", ("scissors", "paper"): "Win", ("scissors", "rock"): "You Lose", ("scissors", "scissors"): "Draw" }
修改后的对局逻辑代码
@client.command() async def rockpaperscissors(ctx, rpschoice): # 可选输入校验,避免用户输入非法内容触发KeyError if rpschoice not in rps: await ctx.send("请输入合法出拳:rock/paper/scissors") return x = random.choice(rps) await ctx.send(x) await ctx.send(table[(rpschoice, x)])
原有rps列表的定义无需修改,修改后即可按照你预期的规则输出对局结果。
内容的提问来源于stack exchange,提问作者vazzza
相关产品推荐
相关产品推荐

