我无法弄清楚我做错了什么。我想要一种简单的方法来匹配两个字符串中的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")
答案 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
第一个“拉链”单词并计算具有相似字符的元组。第二个,查找两个单词中但位于不同索引中的字符。