簡體   English   中英

Python-字符和索引匹配

[英]Python - char and index match

我不知道我在做什么錯。 我想要一種在兩個字符串中匹配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")

在行中

for i in guess:

變量i將是字符串猜測中的每個字符,而不是索引。 如果打算同時獲取索引和字符,則需要使用enumerate()

接下來,我不確定您打算比較什么

if i == i in real:

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

if i[x] == i[x]

您可以使用很多方便的工具,尤其是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)

我想您正在嘗試這樣做:

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都在同一位置匹配真實的char。 如果不匹配,則打印“否”。 我不明白為什么一開始需要牛= 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)

希望下面的代碼對您來說不太高級。 它使用了非常方便的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):的第一行, for i, c in enumerate(guess):塊中的if c in real:行中的if c in real:之前。

我的老師指出,我應該從“母牛”部分開始,然后針對這些結果,將其范圍縮小到多頭。 這是我整理的工作答案。 我感謝這些建議!

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

對於每種情況,您還可以使用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

第一個“壓縮”單詞並計算具有相似字符的元組。 第二個,查找兩個單詞中但位於不同索引中的字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM