【问题标题】:Python - char and index matchPython - 字符和索引匹配
【发布时间】:2018-04-06 20:49:39
【问题描述】:

我不知道我做错了什么。我想要一种简单的方法来匹配两个字符串中的字符和位置。错误在于它没有识别出我想要作为索引的内容。

我是新手。 :) 我认为专家可以理解我在这里开始尝试做的事情。我不想复制复杂的公牛和奶牛代码,我只是想在早期做这部分。请指教:

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")

【问题讨论】:

  • 而不是 if i == i in real: 你的意思是:if guess.index(i) == real.index(i): 吗?比较 i == ii[x] == i[x]总是为真(重言式)。
  • 是的。谢谢。它现在大部分都在工作,但我有奇怪的错误:“文件”C:/第 5 行,如果 guess.index(i) == real.index(i): ValueError: substring not found"
  • 为了将来参考,您还应该在您的代码不起作用时发布完整的错误消息。在这种特殊情况下,我们可以看到哪里出了问题,但一般来说,如果您可以直接向我们提供这些信息而不是让我们弄清楚,那会好得多。
  • 如果以下答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道您的问题已得到您满意的解决,并为帮助您的人提供帮助。有关完整说明,请参阅here
  • @ReallyRosie 这意味着您正在寻找字符串中未出现的字符的索引。

标签: python string indexing char


【解决方案1】:

您也可以为每种情况使用 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

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

【讨论】:

  • @PM2Ring 抱歉,我不知道你在说什么... :))))))(当然是在开玩笑,感谢您的评论!)
【解决方案2】:

我的老师指出我应该从“奶牛”部分开始,然后针对这些结果,将其缩小到公牛。这是我放在一起的工作答案。感谢您的建议!

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))

【讨论】:

  • 这不会做你想要的。 i == i 总是等于特殊的True 对象,但True 不在real 中,因为real 是一个字符串。相反,您应该简单地拥有if i in real:
【解决方案3】:

我猜你正在尝试这样做:

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")

如果这不是您想要的,请告诉我,以便我可以为您提供更多帮助。此代码打印“靶心!”每次猜测中的字符在同一个地方匹配真实的字符。如果它们不匹配,则打印“否”。一开始我不明白为什么你需要一个 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)

【讨论】:

    【解决方案4】:

    你可以使用很多方便的工具,最重要的是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)
    

    【讨论】:

    • 这段代码可能超出了Rosie现阶段的技能。
    • 绝对有很多值得阅读的内容。我的老师也走进了房间。 ;) 但我真的很感激看到这一切,我希望有一天我能掌握这些技能。
    【解决方案5】:

    希望下面的代码对您来说不是太高级。它使用了非常方便的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: 行之前。

    【讨论】:

    • 这很棒。非常感谢!
    【解决方案6】:

    排队

    for i in guess:
    

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

    接下来我不确定你打算比较什么

    if i == i in real:
    

    此外,x 在此行之前的任何地方都没有初始化:

    if i[x] == i[x]
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 1970-01-01
      • 2020-06-08
      • 2015-07-11
      • 1970-01-01
      • 2019-06-24
      • 2015-06-22
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多