10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonのappendメソッドの存在意義に気付いた

Posted at

プログラミング初学者の発見と成長の記録です。
ある条件に合致する単語をリストに追加するコードを書いて学んだことをメモします。

取り組んだ課題

「入力された文字列から、 "a"を含む単語だけを抽出して表示するプログラムを作成する。
ただし、単語は半角スペースで区切られているものとする。」

条件

  • 大文字・小文字は区別せずにチェックする(aA を同じとみなす)
  • "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()

コーディング学習、一歩ずつ進んでいきます🦏

10
5
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?