2

'_ 'このハングマンの問題があり、この部分では、プレースホルダーを彼らが正しく推測した文字に置き換えようとしています. たとえば、もしsecretWord = 'lettuce'、そして彼らが推測した場合e、私はそれを secretWord を通過させ、その中に e が含まれているかどうかを確認し、それを に置き換えて'_ 'eそれを返すようにし たい_ e_ _ _ _ e

私のコードは次のとおりです。

のプレースホルダー文字列表現を作成するsecretWord

so Far = '' 
for char in secretWord:
    soFar = soFar + '_ '

プレースホルダーを確認/正しい文字に置き換えます

for char in secretWord:
    if char in lettersGuessed:
    soFar.replace('_ ', str(char))
print soFar

しかし、pythontutor.com では、secretWord = 'lettuce'lettersGuessed = ['z', 'x', 'q', 'l', 'e', 't', 't', 'u', 'c', 'e']の出力は次のとおりです。

    _ _ _ _ _ _ _ 
    l l l l l l l 
    l l l l l l l
    l l l l l l l 
    l l l l l l l 
    l l l l l l l 
    l l l l l l l 
    l l l l l l l 

基本的に、それはl推測された文字であることがわかり'_ '、その文字に置き換えることになっているため、それらすべてを置き換えました。しかし、私はそれを一度だけやりたいだけです(そして、それが再び入っている場合はsecretWordもう一度)。そして、他のキャラクターを置き換えることはできませんでした'_ '....

4

4 に答える 4

2

特定の位置replaceで文字を置き換えようとしているときに使用したくない; 特定の値に一致するすべてのインデックスのすべての文字を置き換えたい場合のみです。

インデックスで文字を置き換える方法は、スライスを使用することです。

soFar = soFar[:index] + newChar + soFar[index+1:]

この場合、secretWord の各文字は soFar の2 つの文字と一致するため、それらを 2 倍にする必要があります。

soFar = soFar[:index*2] + newChar + soFar[index*2+1:]

しかし、どのようにしてインデックスを知っていますか? 文字列を呼び出すindexのではなく、同じ問題が発生し、必要な値ではなく、その値を持つ最初の文字のインデックスが返されます。関数を使用して、enumerate進行中にカウントを維持します。

for index, char in enumerate(secretWord):

kevinsa5 が示唆するように、文字列の代わりにリストを使用した場合は、これをより簡単にすることができます:

soFar = []
for char in secretWord:
    soFar.append('_')

さて、交換は次のとおりです。

soFar[index] = char

ただし、それを文字列として出力すると['_', '_']_ _. joinこれを適切な文字列に変換するには、次のメソッドを使用する必要があります。

print ' '.join(soFar)
于 2013-11-13T20:39:24.630 に答える
1

文字列ではなくリストを使用します。

soFar = [char if char in lettersGuessed else '_' for char in secretWord]
print(' '.join(soFar))

また、 よりも である方がlettersGuessedよいでしょう。セット内のメンバーシップのみを気にするため、固有のアイテムのみを含めることが適切です。setlistlettersGuessed

于 2013-11-13T20:42:29.927 に答える
0

'_'現在の方法では、すべての文字を に表示される最初に推測された文字に置き換えていsecretWordます。なので、 を推測するlと、すべてに_が入りlます。

代わりにできること:

for index, char in enumerate(secretWord):
    if char in lettersGuessed:
    soFar = soFar[:index-1]+char+soFar[index+1:]
print soFar
于 2013-11-13T20:40:14.463 に答える
0

abarnert はすでにきちんとした解決策を提供していますが、

「unguessed_letters」を追跡し、「maketrans」を使用して、この問題に取り組みました

解決:

from string import maketrans    
def process_guess(secret_word, unguessed_letters, guess):
    if guess in secret_word:
        unguessed_letters = unguessed_letters.replace(guess, '')
    trantab = maketrans(unguessed_letters, "_"*len(unguessed_letters))
    return secret_word.translate(trantab), unguessed_letters

使用方法のデモンストレーション:

secret_word = "lettuce"
unguessed_letters = secret_word
lettersGuessed = ['z', 'x', 'q', 'l', 'e', 't', 't', 'u', 'c', 'e']
for i in lettersGuessed:
    secret_mask, unguessed_letters = process_guess(secret_word, unguessed_letters, i)
    print secret_mask

実行出力:

$ python j.py 
_______
_______
_______
l______
le____e
lett__e
lett__e
lettu_e
lettuce
lettuce
于 2013-11-13T22:27:31.417 に答える