Python - char和index匹配

时间:2017-10-25 16:46:56

标签: python string indexing char

我无法弄清楚我做错了什么。我想要一种简单的方法来匹配两个字符串中的char和position。错误在于它没有意识到我打算作为索引。

我是新来的。 :)我认为专家可以理解我在这里开始尝试做什么。我不想复制复杂的公牛和奶牛代码,我只想尽早做到这一点。请指教:

def bulls_and_cows(real, guess):
    bulls = 0
    cows = 0
    for i in guess:
        if i == i in real:
            if i[x] == i[x]
            bulls = bulls + 1
            print ("Bullseye!")
            print(bulls)
    else:
        print("No")

bulls_and_cows("like", "brig")

6 个答案:

答案 0 :(得分:0)

在第

for i in guess:

变量i将是字符串猜测中的每个字符,而不是索引。如果您打算同时获取索引和字符,则需要使用enumerate()

接下来我不确定你打算在

中比较什么
if i == i in real:

此外,x未在此行之前的任何位置初始化:

if i[x] == i[x]

答案 1 :(得分:0)

你可以使用很多方便的工具,最重要的是zip

from collections import Counter
def bulls_and_cows(real, guess):
    # count bulls
    bulls = sum(x == y for x, y in zip(real, guess))

    # get letter counts separately for each string
    c1, c2 = map(Counter, (real, guess))

    # cows: sum min count for any letter, subtract bulls
    cows = sum(min(c1[x], c2[x]) for x in set(real) | set(guess)) - bulls

    print(bulls, cows)

对于纯显式迭代公牛计数:

def bulls_and_cows(real, guess):
    bulls = 0
    for r, g in zip(real, guess):
        if r == g:
            bulls += 1
    print(bulls)

答案 2 :(得分:0)

我猜你是想这样做的:

def bulls_and_cows(real, guess):
    bulls = 0
    cows = 0
    for i in range(len(guess)):
        if guess[i] == real[i]:
            bulls = bulls + 1
            print ("Bullseye!")
        else:
            cows += 1

    if bulls == 0:
        print("No")
    else:
        print("Bulls: " , bulls, " Cows: ", cows)

bulls_and_cows("like", "brig")

如果不是您的意图,请告诉我,以便我能为您提供更多帮助。这段代码打印“Bullseye!”因为每次猜测中的char都匹配同一地方的真实字符。如果不匹配则打印“否”。我无法理解为什么你最初需要一个cows = 0,因为你从未在你的代码中使用它。

另请注意,缩进在python中非常重要。所以在你的代码中,if之后的至少一行应该缩进。此外,在此代码中,我假设两个输入字符串的长度相同。如果不是,您可能会遇到超出范围的错误。为防止出现此类错误,最好在函数开头比较两个字符串的长度:

if len(real) != len(guess):
    print("The strings Length does not match!")
    return

如果您坚持比较字符串,即使它们的长度不同,另一个防止此错误的选项是更改代码,如下所示:

def bulls_and_cows(real, guess):
    bulls = 0
    cows = 0
    real_len = len(real)
    guess_len = len(guess)
    for i in range(real_len):
        if i < guess_len and guess[i] == real[i]:
            bulls = bulls + 1
            print ("Bullseye!")
        else:
            cows += 1

    if bulls == 0:
        print("No")
    else:
        print("Bulls: " , bulls, " Cows: ", cows)

答案 3 :(得分:0)

希望以下代码对您来说不太先进。它使用非常方便的enumerate函数,它允许我们循环一个字符串并获取索引和字符。实际上,enumerate是一个通用函数,当我们需要获取项及其索引时,可以在任何for循环中使用。

def bulls_and_cows(real, guess):
    bulls = cows = 0
    for i, c in enumerate(guess):
        if c in real:
            # We have a match!
            if real[i] == c:
                # And it's in the correct position
                bulls += 1
            else:
                cows += 1

    print('Bulls', bulls, 'Cows', cows)

bulls_and_cows("like", "brig")

<强>输出

Bulls 0 Cows 1

我的代码并没有产生您想要的确切输出,但我相信您可以解决这个问题。 ;)

如果您无法理解我的代码是如何工作的,请尝试添加

print(i, c)

作为for i, c in enumerate(guess):块中的第一行,位于if c in real:行之前。

答案 4 :(得分:0)

我的老师指出我应该从“奶牛”部分开始,然后对于那些结果,将它缩小到公牛。这是我放在一起的工作答案。我很欣赏这些建议!

def bulls_and_cows(real, guess):
    bulls = 0
    cows = 0
    for i in guess:
        if i == i in real:
            cows = cows+1
            if guess.index(i) == real.index(i):
                cows = cows -1
                bulls = bulls +1
    print("Bulls: " + str(bulls))
    print("Cows: " + str(cows))

答案 5 :(得分:0)

对于每种情况,您也可以使用1个班轮:

real = "like"
guess = "brig"
print("Bulls", sum(1 for x in zip(real, guess) if x[0] == x[1])) # Bulls 0
print("Cows", sum(1 for x in real if x in guess and real.index(x) != guess.index(x))) # Cows 1

第一个“拉链”单词并计算具有相似字符的元组。第二个,查找两个单词中但位于不同索引中的字符。