Python统计列表中元素的数量,但不在正确的位置,没有重复项

2024-05-15 19:11:25 发布

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

我希望:

In [1]: check('ABCD', 'ABCD')
Out[1]: (4, 0)

In [2]: check('AAAA', 'ABCD')
Out[2]: (1, 0)

In [3]: check('AADA', 'ABCD')
Out[3]: (1, 1)

In [4]: check('ADDA', 'ABCD')
Out[4]: (1, 1)

In [5]: check('ADDB', 'ABCD')
Out[5]: (1, 2)

函数检查有两个参数,第一个是猜测,第二个是正确的代码。
在“Out”中,第一个数字是正确位置的正确字母数。
第二个是正确的字母数,但不在正确的位置。
使用我的代码,我可以毫无问题地找到第一个数字,但第二个数字给我带来了困难,因为我无法找到一个不算重复的代码。

i、 e:如果我做了check('ADDB', 'ABCD'),我得到(1,4),因为它在正确的位置计算了一个(不应该),两个“D”(应该算为1)和B(这个可以)。

代码如下:

def check(guess, code):
    cInCode = 0 # letter in code but wrong place
    cInPlace = 0 # right letter & right place
    for x in range(0, len(code)):
        if code[x]==guess[x]:
            cInPlace += 1
        cInCode += code.count(guess[x])
    return '('+str(cInPlace)+','+str(cInCode)+')'

Tags: 代码incheck字母codeplace数字out
2条回答

比主要答案短的另一个答案:

def check(code, guess):
    match = sum(1 for c, g in zip(code, guess) if c == g)
    common = sum((Counter(code) & Counter(guess)).values())
    return match, common - match

最简单的方法可能是首先统计所有公共元素,这可以通过collections.Counterhttps://docs.python.org/3/library/collections.html#collections.Counter)完成。如果然后减去位于正确位置的元素,将得到位于错误位置的常见元素

from collections import Counter

def common_elements(guess, code):
    # Counter() makes frequency counts
    # "&" intersects them (counting the elements in common)
    # .values() takes only the counts, and sum() adds them up
    return sum((Counter(guess) & Counter(code)).values())

def right_place(guess, code):
    # zip() iterates over pairs of elements
    # eg zip('ABC', 'DEF') yields ('A', 'D'), ('B', 'E'), ('C', 'F')
    return sum(a == b for a,b in zip(guess, code)) # assumes same length!

def wrong_place(guess, code):
    return common_elements(guess, code) - right_place(guess, code)

相关问题 更多 >