次のようなリストがあるとします。
Lists = ["1:りんご", "2:バナナ", "パイナップル", "3:レモン", "メロン"]
この中から数字の振られている文字列のみを抜き出し、新しく別の配列に組み直すプログラムを書くと以下の2パターンで書けます。
パターン1
Lists = ["1:りんご", "2:バナナ", "パイナップル", "3:レモン", "メロン"] NewLists = [] for i in range(len(Lists)): if ":" in Lists[i]: NewLists.append(Lists[i])
パターン2
Lists = ["1:りんご", "2:バナナ", "パイナップル", "3:レモン", "メロン"] NewLists = [] for List in Lists: if ":" in List: NewLists.append(List)
この2パターンの実行結果は以下の画像の通りです。
このように、リストの中から特定の条件を満たす要素だけを抜き出して新しく配列に組み直すためには、
1:新しく要素を組み込む配列変数(今回はNewListsとした)を宣言。
2:元のリストの要素の数だけfor文を回す。
3:for文の中にif文を置いて条件分岐させる。
4:条件に合致した時だけ配列に要素を組み込む。
といった工程が必要になります。
そのため、たったこれだけの処理で4行ものコードを書かなければいけません。
内包表記を使えば4行が1行に!?
最近知ったのですが、for文を内包表記で記述すると行数を一気に減らせるとのこと。
そこで早速書き方を覚え、以下のように書き直してみました。
パターン1(内包表記バージョン)
Lists = ["1:りんご", "2:バナナ", "パイナップル", "3:レモン", "メロン"] NewLists = [Lists[i] for i in range(len(Lists)) if ":" in Lists[i]]
パターン2(内包表記バージョン)
Lists = ["1:りんご", "2:バナナ", "パイナップル", "3:レモン", "メロン"] NewLists = [List for List in Lists if ":" in List]
なんかめちゃくちゃスッキリしました(笑)
実行結果は以下の通りです。
4行で書いていた時と全く同じ結果になりました。
まとめ
配列の中から特定の要素だけを取りだし、新たな配列に組み直す処理というのは、プログラムを組んでいるとよくあると思います。
その際に、最初に示していたような4行も要するコードを頻繁に書いていたら、どうしてもコードの見栄えが悪くなってしまいます。
そこで内包表記法を使ってシンプルに1行にしてしまえば、一気にコードの視認性が高まり、メンテナンスがしやすくなるのでおすすめです。
コメント