比较Python中关于相等和定位的两个列表

2024-10-01 15:34:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个可玩的经典游戏Mastermind作为一个爱好项目,我需要能够比较两个字符串列表(一个是猜测,另一个是代码),并获得应该显示为反馈的“pegs”的数量和颜色

基本上,对于相同颜色和相同位置的两个销钉,将显示一个红色销钉。对于具有不同位置的相同颜色的两个销钉,将显示一个白色销钉。但是,一个白钉必须与两个特定钉匹配(例如,Guess=[绿色,绿色,绿色,蓝色],Code=[黄色,黄色,绿色,绿色]将显示一个红色和一个白色钉)

我已经找到了很多关于公正立场或公正平等的比较的帖子,但我需要一个兼顾两者的算法。以下是我目前的代码:

def getResponse(guess, code):
    pegs = []
    usedIndices = []
    usedCodeIndices = []
    for x in range(len(guess)):
        if guess[x] == code[x]:
            usedIndices.append(x)
            usedCodeIndices.append(x)
            pegs.append("red")
        elif guess[x] in code and x not in usedIndices:
            usedIndices.append(x)
            usedCodeIndices.append(code.index(guess[x]))
            pegs.append("white")
    return pegs

此代码适用于红色标记,但不会识别重复标记并显示过多的白色标记(例如,Guess=[Blue,Blue,Blue,Blue,Blue],code=[Blue,red,Blue,white]将导致显示两个红色标记和两个白色标记,即使只显示两个红色标记


Tags: 代码in标记颜色codeblueguess绿色
1条回答
网友
1楼 · 发布于 2024-10-01 15:34:39

您可以使用zip计算位置匹配和整体颜色匹配的计数器。然后从颜色匹配计数中减去位置匹配计数:

guess = ["R","R","B","W","Y"]
code  = ["R","G","B","R","Y"]

from collections import Counter
positionMatches = sum(a==b for a,b in zip(guess,code))
colorMatches    = len(code) - sum((Counter(code)-Counter(guess)).values())
colorMatches   -= positionMatches

print(positionMatches,colorMatches) # 3 1

相关问题 更多 >

    热门问题