プログラミング初学者の発見と成長の記録です。
ある条件に合致する単語をリストに追加するコードを書いて学んだことをメモします。
取り組んだ課題
「入力された文字列から、 "a"を含む単語だけを抽出して表示するプログラムを作成する。
ただし、単語は半角スペースで区切られているものとする。」
条件
- 大文字・小文字は区別せずにチェックする(
a
とA
を同じとみなす) - "a" を含む単語がない場合は、「該当する単語はありません」と表示する
#入力値の例
apple banana cherry
💡今回学べたこと
- Pythonで文字列全体を1つの要素としてリストに格納したい場合はappendメソッドが欠かせない
- 文字列の分割にはstr.split()メソッドを使う。任意の区切り文字を引数に指定。引数に指定がない場合はスペースを区切り文字とする
- in演算子は大文字と小文字を区別する。区別せずに演算したい場合は事前にlowerメソッドかupperメソッドで表記を揃える
今回の記事では、タイトルにもある通り「appendメソッドの存在意義」について扱います。
リストへの追加で起きた想定外の挙動
appendを使わずに代入演算子+=
でリストに代入しようとしたところ、想定外の結果を招きました
# 入力フォームから文字列を受け取る
words = input("任意の文字列を入力してください: ")
# スペースを区切り文字として分割し、リストに格納
listed_words = words.split()
# "a"を含む単語を格納するリストを宣言
filtered_words = []
# 単語をチェックして順番にリストに格納
for word in listed_words:
word = word.lower()
if "a" in word:
filtered_words += word # 問題の発生箇所
# 結果を出力
if filtered_words:
for i in filtered_words:
print(i)
else:
print("該当する単語はありません")
チェックした単語を、代入演算子”+=”でリストに代入しようとしている。
期待していた結果
apple
banana
実際の結果
一文字ずつ出力された
a
p
p
l
b
a
n
a
n
a
どうしてこうなった?
理由は、Pythonが文字列をイテラブル(反復可能)なオブジェクトとして扱うからです。
例 :
word = "apple"
for char in word:
print(char)
結果
a
p
p
l
e
このようにPythonの文字列ループの中では、文字列は一文字ごとに分割して扱われます。
このイテラブルな特性は便利で、これまでにも無意識に活用してきました。
しかし、先ほどのように+=
した場合、一文字ずつ単独で取り出して格納する結果を招くことになります。
文字列全体を1つの要素としてリストに格納したい場合はappend()を使う必要があります。
文字列全体をリストに追加したければ、appendを使うべし
問題のあった箇所を修正します。
# 単語をチェックして順番にリストに格納
for word in listed_words:
word = word.lower()
if "a" in word:
filtered_words += word # 問題の発生箇所
# 単語をチェックして順番にリストに追加
for word in listed_words:
word = word.lower()
if "a" in word:
filtered_words.append(word)
これってPython特有?
ほぼPythonしか触ったことがないのですが、ちょろっと遊びでphpをいじったときは、+=
で文字列ごと代入できていました。
どうやらJavaScriptも+=で問題なくリストに追加できるようです。
Pythonでは文字列のイテラブルな特性により、+=
の挙動が他の言語と異なります。
おわりに
- 文字列全体をリストに追加したければ、appendを使う。
- str.split()はメソッドチェーンでまとめて書くこともできた
words = input("任意の文字列を入力してください: ").split()
コーディング学習、一歩ずつ進んでいきます🦏