2017-01-15 6 views
0

私はGoogleのPythonの演習をダウンロードして、これは質問のいずれかになります。Pythonコードで 'append'が期待通りに機能しないのはなぜですか?

文字列のリストを指定すると、文字列の長さが2以上と最初と最後の文字です 文字列の数を返します文字列 の本に同じ

私の答えは以下の通りですされています。このリストは、しかし

def match_ends(words): 
    a=[] 
    for word in words: 
    if len(word)>=2 and word[0]==word[-1]: 
     a=a.append(word) 
    return len(a) 

words=['aba', 'xyz', 'aa', 'x', 'bbb'] 

「1」を返します。私はなぜappendがturnと一致するすべての文字列を追加しなかったのか分かりません。

これは、Googleのソリューションです:

def match_ends(words): 
    count = 0 
    for word in words: 
    if len(word) >= 2 and word[0] == word[-1]: 
     count = count + 1 
    return count 
+2

'append'が行われました*インプレース*。割り当てを削除します。 –

+1

あなたの 'return'は間違った方法で字下げされています、それはもっと左にあるはずです。 –

答えて

4

ここでは二つの問題があります。

  • インデントの問題:
 
def match_ends(words): 
    a=[] 
    for word in words: 
    if len(word)>=2 and word[0]==word[-1]: 
     a=a.append(word) 
    return len(a) 

return文がforを置いていますループは、1回の反復の後に答えを返します(0または1)。ですから、このような問題を解決することができます

 
def match_ends(words): 
    a=[] 
    for word in words: 
    if len(word)>=2 and word[0]==word[-1]: 
     a=a.append(word) 
    return len(a) 
  • さらに、あなたはaa.append(word)の結果を割り当てます。 .appendNoneを返します(実際には.appendは何も返しません。したがって、Pythonは自動的にNoneを返します)、次の繰​​り返し、aはもうlistでなくなり、プログラムがクラッシュします。だから、a.append(word)a = a.append(word)を置き換える:
 
def match_ends(words): 
    a=[] 
    for word in words: 
    if len(word)>=2 and word[0]==word[-1]: 
     a.append(word) 
    return len(a) 

今、あなたのプログラムが動作します。それにもかかわらず、は、一致したすべての単語を保存することは役に立たないので、役に立たない。追加のメモリが必要ないので、一致を検出した場合はカウンタを使用してカウンタを増やすことをお勧めします。 Googleの答えはより効率的です

1

インデントこのようなあなたのreturn文:あなたはifのレベルにそれを置くとき、それは今含まれているリストaの長さを出力します

for word in words: 
    if len(word)>=2 and word[0]==word[-1]: 
     a.append(word) 
return len(a) 

[「A」]として1(のための真の検証最初と最後の文字が同じであることがわかった最初の単語)、それはreturnステートメントなので終了します。ループはリストwordsの他の単語を検証しません。

私は割り当てに気付かなかったので、答えを編集しました。append関数は代入を必要としません。ありがとうございます@ウィレム

+0

これは問題を完全に解決するものではありません: 'a = a.append(word)'は1回の反復の後に 'a'が' None'に設定され、プログラムは2回目の反復でクラッシュします。 –

+0

'' None''を返すことはありません。 '' ''が成功した後に '' None''になります。 –

+1

@WillemVanOnsemええ、間違えてしまった。ありがとうございました。それに応じて答えを変更 – sleepcoffeedelight

関連する問題