Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonリスト内包表記の使い方を徹底解説!基本から実例まで

Pythonのリスト内包表記(List Comprehension)とは、既存のリストをもとに新しいリストを作成するための記法です。リストから特定の要素を抽出したり、既存のリストの値を変換したりする場面でよく使われます。リスト内包表記は角括弧 [] で囲んで記述します。

リストを扱っていると、既存のシーケンスの内容をもとに新しいリストを作りたくなることがあります。例えば、文字列のシーケンスからリストを生成したい場合や、別のリストの値をすべて2倍にしたリストを作りたい場合などが挙げられます。

そんなときに役立つのがリスト内包表記です。この記事では、Pythonリストの基礎をおさらいしながら、リスト内包表記の使い方を実例付きでわかりやすく解説します。

Pythonリストの基礎のおさらい

リストは、Pythonで複数の項目をまとめて格納できるデータ構造です。何らかの関連性を持つ複数の値を扱いたいときに、よく利用されます。

例えば、アイスクリーム店で販売しているすべてのフレーバーをリストで管理したり、ワインクラブ会員の電話番号一覧をリストに保存したりできます。

以下はPythonにおけるリストの基本的な例です。

pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']

リストの基礎を確認できたところで、次はいよいよリスト内包表記の使い方を見ていきましょう。

Pythonリスト内包表記とは

リスト内包表記を使うと、別のリストの内容から新しいリストを生成できます。リストの複製や、既存リストの内容を加工した新リストの作成はもちろん、タプルや文字列などの他のイテラブル(反復可能オブジェクト)の中身をリストに変換することも可能です。

また、フィルター条件を指定すれば、新しいリストに含める値を絞り込むこともできます。例えば、数値のリストから「250より大きい数値だけ」を含む新しいリストを作るといったことができます。

リスト内包表記の基本構文

Pythonのリスト内包表記は、以下のような構文で書きます。

[expression for item in list]

この構文はPythonの for 文に似ていますが、1行で完結する点が異なります。for 文との違いを明確にするため、リスト内包表記は角括弧で囲まれています。

構文は大きく3つの要素で構成されています。

  • expression(式):新しいリストに格納される最終的な値。
  • item(要素):繰り返し処理の対象となる個々の項目。
  • list(リスト):内包表記が走査する対象のリストまたはイテラブル(タプル・文字列・リストなどが使用可)。

if文・if...else文との組み合わせ

リスト内包表記には、if 文や if...else 文を組み込むこともできます。

[expression for item in list if condition else none]

この形式では、指定した条件を満たす要素だけが新しいリストに追加されます。

リスト内包表記を使えば、本格的な for 文を定義しなくても、既存のリストから新しいリストを作成できます。for 文は最低でも2行のコードが必要ですが、リスト内包表記なら1行で書けるのが大きなメリットです。

「リスト内包表記の方がPythonic(Pythonらしい書き方)だ」と言われることもあります。これは、短い for 文を使うよりも効率的だからです。

Pythonリスト内包表記の実例

ここでは、店舗で販売しているチキンピザだけを集めたリストを作成するケースを考えてみましょう。メニュー上でチキンピザを「Chicken」カテゴリに分類したいとします。これを実現するには、for 文でフィルタリングする方法と、リスト内包表記を使う方法の2通りがあります。

リスト内包表記を使えば、既存のピザリストから、名前に「Chicken」を含むピザだけを集めた新しいリストを生成できます。コードは以下のようになります。

pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']

chicken_pizzas = [p for p in pizzas if "Chicken" in p]
print(chicken_pizzas)

このコードを実行すると、次の出力が得られます。

['Chicken', 'Chicken and Bacon', 'BBQ Chicken']

まず、メニューのピザ一覧を変数 pizzas として定義します。その後、リスト内包表記を使って、名前に「Chicken」を含むピザだけで構成される新しいリストを作成しています。

このリスト内包表記は、以下の3つの部分から成り立っています。

  • p:リストに追加される値。
  • for p in pizzas:「pizzas」リスト内の各ピザを順番に取り出してループ処理します。
  • if "Chicken" in p:各ピザに「Chicken」が含まれているかどうかを判定します。結果がTrueの場合、変数「p」に格納されている値がリストに追加されます。

ご覧のとおり、リスト内包表記ならわずか1行のコードで済みます。一方、次の例のように for 文を使うと、同じ処理に3行必要になります。リスト内包表記がどれほどクリーンなコードを書くのに役立つかがわかるでしょう。

リスト内包表記を使わない場合

先ほどのチキンピザの例を、リスト内包表記なしで書いてみましょう。メニューからチキンピザの一覧を生成したい場合、通常は次のようなコードになります。

pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']
chicken_pizzas = []

for pizza in pizzas:
	if "Chicken" in pizza:
		chicken_pizzas.append(pizza)

print(chicken_pizzas)

このコードの出力は以下のとおりです。

['Chicken', 'Chicken and Bacon', 'BBQ Chicken']

まず2つのリストを定義します。1つは店舗で販売しているピザの一覧、もう1つは販売しているチキンピザを格納するリストです。チキンピザのリストは最初は空の状態です。

次に for 文でピザリストの各要素を順に確認し、そのピザに「Chicken」という単語が含まれているかどうかをチェックします。「Chicken」を含むピザであれば、チキンピザのリストに追加します。この例では3つのピザが「Chicken」を含んでいるため、3つすべてが chicken_pizzas リストに追加されました。

このように、「Chicken」が含まれているかを判定してリストに追加する処理には、3行のコードが必要です。しかし、リスト内包表記を使えば、もっと効率的に書けます。

if...else文を使ったリスト内包表記

リスト内包表記では、if...else 文を組み合わせることもできます。

先ほどの例では、if 文を使って、名前に「Chicken」を含むピザだけをリストに追加しました。今度は、どのピザがベジタリアン向けかを判定するリストを作ってみましょう。

具体的には、ピザ名に「Chicken」が含まれていれば「Meat」を、含まれていなければ「Vegetarian」をリストに追加していきます。

これはリスト内包表記で次のように書けます。

pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']

is_veggie = ["Meat" if "Chicken" in p else "Vegetarian" for p in pizzas]

print(is_veggie)

実行結果は以下のとおりです。

['Meat', 'Vegetarian', 'Meat', 'Vegetarian', 'Vegetarian', 'Meat']

コードの流れを分解してみましょう。まず、ピザの一覧を pizzas というリストとして宣言します。続いて、リスト内包表記を使って、各ピザ名に「Chicken」が含まれているかどうかを評価します。

ピザ名に「Chicken」が含まれている場合は is_veggie リストに「Meat」が追加され、含まれていない場合は「Vegetarian」が追加されます。

出力結果を見ると、is_veggie の最初の値は「Meat」になっています。これは、対応する pizzas の最初の値が「Chicken」だからです。一方、2番目の値は「Vegetarian」です。対応するピザが「Margherita」で、「Chicken」を含まないためです。

まとめ

リスト内包表記を使うと、既存のリストをもとに新しいリストを簡単に作成できます。リストのコピーを作ったり、古いリストから条件に合う値だけを抽出した新しいリストを作ったりすることが可能です。

この記事では、Pythonリストの基礎と、リスト内包表記を使って新しいリストを生成する方法を実例とともに解説しました。

Pythonプログラミングについてさらに学びたい方は、ぜひ「Pythonの学び方ガイド」も参考にしてください。Python習得への道のりをサポートする学習リソースを多数紹介しています。

  1. Pythonでswitch文を実現する方法:辞書とget()メソッドを使った実装ガイド

    JavaやC#とは異なり、Pythonには組み込みのswitch文が存在しません。そのため、「switch…case」のような条件分岐を実現したい場合は、自分でコードを書いて同等の動作を再現する必要があります。 この記事では、Pythonで「switch…case」に相当する処理を書く方法を解説し、実際に動作するサンプルコードを2つ紹介します。記事を読み終える頃には、あなたのコードにも自信を持って疑似switch文を組み込めるようになっているでしょう。 switch文のおさらい switch文とは、複数のコードブロックの中から1つを選択して実行するための構文です。プログラム内で複数の条件式を評

  2. PythonでHello Worldを表示する方法:初心者向けステップバイステップガイド

    Pythonの「Hello World」プログラムは、多くのプログラマーが最初に書くプログラムです。print文を使って文字列をコンソールに表示するだけのシンプルなもので、コードは print(Hello World) の1行のみです。 Pythonが正しくインストールされているかを確認するには、まず「Hello World」を書いてみるのがおすすめです。作成方法は主に2つあります。ターミナル(コマンドライン)を使う方法と、Visual Studio CodeやVimなどのコードエディタを使う方法です。 始める前に、お使いのマシンにPython 3がインストールされていることを確認しておき