0

これは宿題の質問です。単語と文字を受け取り、単語内のその文字の出現箇所をすべて削除する関数を定義する必要があります。正規表現や文字列ライブラリなどは使用できません。私はもう試した...

def delete(word,letter):
    word = []
    char = ""
    if char != letter: 
        word+=char
    return word

def delete(word,letter):
    word = []
    char = ""
    if char != letter:  #I also tried "if char not letter" for both
        word = word.append(char)
    return word

どちらも出力を与えません。私は何を間違っていますか?

4

6 に答える 6

4

さて、あなたの関数をよく見てください:

def delete(word,letter):
    word = []
    char = ""
    if char != letter: 
        word+=char # or `word = word.append(char)` in 2nd version
    return word

したがって、関数は単語と文字を取得します。最初に行うことは、ローカル変数を別の値 (新しい空のリスト) で上書きしているため、単語を破棄することです。次に、空の文字列を初期化し、charその内容 (空) を渡された文字と比較します。それらが等しくない場合、つまりが空の文字列でない場合letter、 の空の文字列がchar(空のリスト) に追加されwordます。そして、word返されます。

リストに文字列を追加できないことにも注意してください。リストに対する+操作は、2 つのリストを結合するためにのみ実装されているため、appendバージョンの間違いはほとんどありません。結果として文字列が必要な場合は、最初から結果をそのまま保存する方が理にかなっています。

渡された単語とはまったく関係のないことが起こったときに空の文字列/リストに空の文字列を追加する代わりに、元の単語をそのままにして、何とか各文字を調べたい. 基本的に、単語をループして、渡された文字以外のすべての文字を保持する必要があります。このようなもの:

def delete(word, letter):
    newWord = '' # let's not overwrite the passed word
    for char in word:
        # `char` is now each character of the original word.
        # Here you now need to decide if you want to keep the
        # character for `newWord` or not.
    return newWord

for var in something基本的にシーケンスを取得somethingし、変数を使用して識別されるそのシーケンスの各値に対してループ本体を実行しますvar。文字列は一連の文字であるため、ループ変数には単一の文字が含まれ、ループ本体は文字列内の各文字に対して実行されます。

于 2013-03-21T17:41:50.690 に答える
1

word関数に渡されたものは何もしていません。最終的には、関数()に渡された単語を繰り返し処理し、for character in word: doSomething_with_characterそこから出力を作成する必要があります。

于 2013-03-21T17:35:23.770 に答える
0
def delete(word, ch):
    return filter(lambda c: c != ch, word)

基本的に、一致する文字をドロップして、文字列を線形に渡すだけchです。

filter高階関数と を取りますiterable。文字列は であり、iterableそれを反復処理すると、それに含まれる文字が反復処理されます。filter高階関数が返す iterable から要素を削除しますFalse

この場合、渡された引数filterに等しいすべての文字を除外します。ch

于 2013-03-21T17:38:04.067 に答える
0

理解する価値のある機能的なスタイル @TC1 と @user2041448 が気に入っています。別の実装を次に示します。

def delete( letter, string ):
    s2 = []
    for c in string:
        if c!=letter:
             s2.append( c )

     return ''.join(s2)
于 2013-03-21T17:45:36.060 に答える
0

あなたの最初の関数は、おそらく最も適切な選択ではないリストで + 演算子を使用しています。+ 演算子はおそらく文字列用に予約する必要があります (リストでは .append() 関数を使用します)。

文字列を返すことが目的の場合は、[] の代わりに "" を割り当て、 + 演算子を使用ます

文字のリスト を返すことが目的の場合は、[] を割り当て、 .append() 関数を使用します。

戻り値を作成するために使用している変数の名前を変更します。

word に何かを代入すると、引数として関数に与えられた内容が取り除かれます。

そのため、result=[] OR result=""などにします。

また:

これを解決しようとしているように見える方法では、元の文字列の文字をループする必要があります。投稿したコードはまったくループしません。

このタイプのセマンティックで for ループを使用できます。

for characterVar in stringVar:
    controlled-code-here
code-after-loop

もちろん、名前を変更できます/変更する必要がありますが、理解できるように名前を付けました。あなたの場合、 stringVar は word に置き換えられ、削除された文字でない場合は、結果に characterVar を追加または追加します。ループに含めたいコードはすべてインデントする必要があります。制御行に続く最初のインデントされていない行は、コードがループの後に来ることを python に示します。

于 2013-03-21T17:54:31.013 に答える
0

これは私が思いついたものです:

def delete(word, letter):
    new_word = ""
    for i in word:
        if i != letter:
            new_word += i
    return new_word
于 2013-03-21T18:06:04.607 に答える