文法・環境

【Python】内包表記の基本的な使い方【リスト、辞書、if、三項演算子】

本記事では、Pythonの内包表記について、紹介します。

内包表記を用いると、リストの生成などの処理を簡潔に記述できるようになります

初心者の方にも理解しやすいように、サンプルコードを交えながら紹介していますので、是非参考にしてみてください。

この記事で分かること

  • 内包表記の基本
  • pythonの内包表記とifの組合せ
  • pythonの内包表記と三項演算子(if else)の組合せ
  • pythonの内包表記とenumerate関数の組合せ
  • pythonの内包表記とzip関数の組合せ
  • 辞書(dict)の内包表記

スポンサーリンク

内包表記の基本

はじめに、Pythonの内包表記の基本的な内容を説明します。

内包表記をうまく使用することで、処理をシンプルに記述できるようになります。

コード全体の可読性が向上するので、基本的な記述方法は覚えておくと良いでしょう。

リスト(list)の内包表記

内包表記はリストの生成に使うことが多いです。

リスト内包表記の記述方法は下記になります。

リストの中にfor文が含まれた構造になっています。

リスト内包表記の書き方

[ 式 for 任意の変数名 in イテラブルオブジェクト ]

イテラブルオブジェクト(リストやタプルなど)から、"任意の変数名"で要素を取り出し、"式"に基づいて値を算出します。

その結果を要素とするリストを生成することができます。

以下、内包表記の基本的な記述のサンプルコードです。

### 内包表記のサンプルコード
num_list = list(range(6))
print(num_list)
# [0, 1, 2, 3, 4, 5]

double_list = [num*2 for num in num_list]

print(double_list)
# [0, 2, 4, 6, 8, 10]

> double_list = [num*2 for num in num_list]

"num_list"から、"num"の変数名で要素を取り出し、"num*2"で2倍しています。

この結果をもとに新たなリストを生成しています。

なお、同様の処理をリスト内包表記を用いずに実現した場合は、以下の記述になります。

### 内包表記を使用しない場合
num_list = list(range(6))
print(num_list)
# [0, 1, 2, 3, 4, 5]

double_list = []
for num in num_list :
    double_list.append(num*2)

print(double_list)
# [0, 2, 4, 6, 8, 10]

新たなリストの生成に関わる記述は、

内包表記では1行で記述できたのに対し、こちらの例ではfor文があるために3行での記述になっています。

内包表記を用いた方がスッキリ記述できることが分かると思います。

なお補足ですが、map関数とlambda式(無名関数)を用いても、同様の処理を1行で記述できます。

ただし、処理がシンプルな場合は、リスト内包表記のほうが可読性が良く好ましいとされています。

### map関数とlambda式のサンプルコード
num_list = list(range(6))
print(num_list)
# [0, 1, 2, 3, 4, 5]

double_list = map(lambda num : num*2, num_list)
print(list(double_list))
# [0, 2, 4, 6, 8, 10]

map関数とlambda式(無名関数)については、下記記事で詳細に解説しているので、興味のある方は確認してみてください。

スポンサーリンク

内包表記とifの組合せ

内包表記は、if文と組合せることも可能です。

if文を用いることで、条件式を満たす要素だけを用いて、新たなリストを作成することができます。

記述方法は、内包表記の基本形に " if 条件式 " を加えるだけです。

内包表記とifの組合せ

[ 式 for 任意の変数名 in イテラブルオブジェクト if 条件式 ]

以下、サンプルコードです。

元のリストの要素が奇数の場合のみ、要素を2倍して新たなリストを作成しています。

### 内包表記とifの組合せのサンプルコード1
num_list = list(range(6))
print(num_list)
# [0, 1, 2, 3, 4, 5]

double_list = [num*2 for num in num_list if num%2 == 1]

print(double_list)
# [2, 6, 10]

> if num%2 == 1

numを2で割ったあまりが1になるかどうかで、偶数・奇数を判定しています。

もう一例、サンプルコードを紹介します。

元のリストの要素のうち、特定の文字を含む要素だけで、新たなリストを作成しています。

### 内包表記とifの組合せのサンプルコード2
fruits = ['Apple', 'Banana', 'Orange', 'Peach', 'Lemon']

list_fruits = [ fruit for fruit in fruits if 'n' in fruit]

print(list_fruits)
# ['Banana', 'Orange', 'Lemon']

> if 'n' in fruit

変数 " fruit " に渡された文字列に、"n"が含まれる場合に真となります。

新たに作成されたリスト" list_fruits"の要素には、すべて"n"の文字が含まれています。

内包表記と三項演算子(if else)の組合せ

内包表記は、三項演算子と組合せることも可能です。

記述方法は以下のとおりで、forの前に三項演算子を記述します。

内包表記と三項演算子

[ 条件式が真の場合の式 if 条件式 else 条件式が偽の場合の式 for 任意の変数名 in イテラブルオブジェクト ]

以下、サンプルコードです。

元のリストの要素の偶・奇を判定し、

奇数の場合には"odd"、偶数の場合は"even"という文字列を新たなリストの要素にします。

### 内包表記と三項演算子の組合せ
num_list = list(range(6))
print(num_list)
# [0, 1, 2, 3, 4, 5]

num_types = ["odd" if num %2 == 1 else "even" for num in num_list]
print(num_types)
# ['even', 'odd', 'even', 'odd', 'even', 'odd']

> if num%2 == 1

三項演算子の条件式にあたる部分です。

条件式が真の場合は、"odd"が新たなリストの要素になり、

条件式が偽の場合は、"even"が新たなリストの要素になります。

スポンサーリンク

内包表記とenumerate関数の組合せ(要素のインデックス取得)

補足的な内容ですが、enumerate関数との組合せについても紹介します。

enumerate関数を用いることで、要素のインデックスと、要素を同時に取得できます。

以下、サンプルコードです。

元のリストの要素のうち、特定の文字を含む要素だけで新たなリストを作成する例にenumerate関数を加えています。

enumerate関数と組み合わせることで、元のリストのどのインデックスに対応する要素だったかが追えるようになります。

### 内包表記とenumerate関数の組合せ
fruits = ['Apple', 'Banana', 'Orange', 'Peach', 'Lemon']

list_fruits = [(num, fruit) for num, fruit in enumerate(fruits) if 'n' in fruit]
print(list_fruits)
# [(1, 'Banana'), (2, 'Orange'), (4, 'Lemon')]

enumerate関数については、下記記事で詳細に解説しているので、興味のある方は確認してみてください。

内包表記とzip関数の組合せ(2つのリストの要素を同時取得)

こちらも補足的な内容になります。

zip関数を用いることで、2つのリストの要素を同時に取得できます

以下、サンプルコードです。

元のリストの要素のうち、特定の文字を含む要素だけで新たなリストを作成する例にzip関数を加えています。

zip関数と組み合わせることで、元のリストと対応するリストの要素と組み合わせて新たなリストを作成できます。

### 内包表記とzip関数の組合せ
fruits = ['Apple', 'Banana', 'Orange', 'Peach', 'Lemon']
prices = [100, 200, 100, 200, 100]

list_fruits = [(fruit, price) for fruit, price in zip(fruits, prices) if 'n' in fruit]
print(list_fruits)
# [('Banana', 200), ('Orange', 100), ('Lemon', 100)]

zip関数については、下記記事で詳細に解説しているので、興味のある方は確認してみてください。

スポンサーリンク

辞書(dict)の内包表記

内包表記は、辞書でも使用することができます

辞書を作成する際に必要な波括弧を用い、" キー(key) : 値(value) " を指定します。

辞書の内包表記

{ キー : 値 for 変数 in イテラブルオブジェクト }

以下、サンプルコードです。

元のリストの文字列と、その文字列の文字数から、新たな辞書を作成しています。

### 辞書の内包表記
fruits_list = ['Apple', 'Banana', 'Orange']

fruits_dict = {fruit : len(fruit) for fruit in fruits_list}

print(type(fruits_dict))
# <class 'dict'>
print(fruits_dict)
# {'Apple': 5, 'Banana': 6, 'Orange': 6}

まとめ

pythonの内包表記について、基本的な使い方を説明しました。

内包表記を用いると、リストの生成などの処理を簡潔に記述できるようになります。

初心者の方は慣れるまでに時間がかかるかと思いますが、手を動かさないとなかなか身に付かないので是非自分でもコードを書いて練習してみてください。

スポンサーリンク

-文法・環境
-