2017-05-20 8 views
-1

私は文字列の最初の文字を取り、それを大文字にする簡単なプログラムを書いています。解説リストvs forループ

def initials(text): 
    words = text.split() 
    a=[word[0].upper() for word in words] 
    b = '. '.join(a) + '.' 
    return b 
text = "have a good day sir" 

print(initials(text)) 

これは私にリストの理解を使用してほしい結果を与えるでしょう。 しかし、私は、それは以下のようにLOOPの典型的なを使用して動作させることができない、それが私の唯一の最後の繰り返しを与える:

def initials(text): 
    words = text.split() 
    for word in words: 
     a=word[0].upper() 
     b = '.'.join(a) + '.' 
    return b 
text = "have a good day sir" 

print(initials(text)) 

2番目の例では、最初の一つとして機能していない理由を任意のアイデアを?

+0

2番目の 'initials'関数の' b'は 'words'の各単語ごとに更新されるため...前のイニシャルを「追跡」しません。 – blacksite

+0

新しいリストに結果を追加し、 'join 'に渡す必要があります。 – pylang

+0

' a + = word [0] .upper() 'と書いて、' b ='。 '。join(a)+'という文を取る必要があります。 ''〜forループの中で – phynfo

答えて

2

bは、2番目のケースのループのたびにリセットされます。したがって、あなたは最後のイニシャルだけを.の後につけます。 forループでのご理解と同等は、次のようになります。あなたは、各ループの繰り返しにBを上書きしている

def initials(text): 
    words = text.split() 
    a = [] 
    for word in words: 
     a.append(word[0].upper()) 
    b = '.'.join(a) + '.' 
    return b 
+0

ありがとう!!!!それは動作します – pythonic

1

。試してみてください:

def initials(text): 
    words = text.split() 
    for word in words: 
     a = word[0].upper() 
     b += '.'.join(a) + '.' 
    return b 
text = "have a good day sir" 
0

問題はstr.join()が文字列の反復可能になりますが、あなたの第二の機能では、単一のchararacterを渡しているということです。ループ内で呼び出すという事実は、それを文字のリストに変換しません。

あなたのための最も簡単な方法は、str.join()を取り除くと、結果を蓄積するために、単純な文字列を使用し得ることです:

def initials(text): 
    words = text.split() 
    b = '' 
    for word in words: 
     a=word[0].upper() 
     b += a + '.' 
    return b 

あなたがstr.join()を使用して主張している場合は、自分のイニシャルを蓄積するために、リストが必要になります。

def initials(text): 
    words = text.split() 
    b = [] 
    for word in words: 
     a=word[0].upper() 
     b.append(a) 
    return '.'.join(b) + '.' 
+0

Pythonでは 'char'型のようなものはありません。長さ1の文字列だけです。 – augurar