内包表記
Pythonではリストやディクショナリをシンプルに作成する方法として内包表記があります。内包表記を用いると、複数行の記述を要する処理を1行で書けてしまうようなこともあり大変便利です。慣れていないと読みづらいと感じることもありますが、それを克服すればむしろ読みやすいと感じるはずです。
まずはリストを内包表記で作成してみましょう。 書式は次の通りです。
comp_list = [<式> for <変数> in <反復可能オブジェクト>]
# -*- coding: utf-8 -*- comp_list = [i for i in range(10)] print list_comp
これは下記コードと同じ処理内容です。
# -*- coding: utf-8 -*-
comp_list = []
for i in range(10):
comp_list.append(i)
print comp_list
--実行結果--
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
このように本来は3行の記述が必要な処理を1行で記述することができます。上記の場合、一番左の「 i 」がリストの要素となりますが、これは式であるため次のようなこともできます。
# -*- coding: utf-8 -*- comp_list = [str(i * i) for i in range(10)] print list_comp
--実行結果--
['0', '1', '4', '9', '16', '25', '36', '49', '64', '81']
次はディクショナリです。辞書内包表記とも呼ばれます。
comp_dict = {<式(key: value)> for <変数> in <反復可能オブジェクト>}
# -*- coding:utf-8 -*-
comp_dict = {str(i): i * i for i in range(10)}
print comp_dict
これは下記コードと同じ処理内容です。
# -*- coding:utf-8 -*-
comp_dict = {}
for i in range(10):
comp_dict[str(i)] = i * i
print comp_dict
--実行結果--
{'1': 1, '0': 0, '3': 9, '2': 4, '5': 25, '4': 16, '7': 49, '6': 36, '9': 81, '8': 64}
次はセットです。集合内包表記とも呼ばれます。
comp_set = {<式> for <変数> in <反復可能オブジェクト>}
# -*- coding:utf-8 -*-
comp_set = {str(i * i) for i in range(10)}
print comp_set
これは下記コードと同じ処理内容です。
# -*- coding: utf-8 -*-
comp_set = set()
for i in range(10):
comp_set.add(str(i * i))
print comp_set
--実行結果--
set(['25', '16', '49', '36', '1', '0', '64', '4', '9', '81'])
これまでは1つのforを内包表記で記述しましたが、ネストすることもできます。
# -*- coding:utf-8 -*- comp_list = [i * ii for i in range(1, 10) for ii in range(1, 10)] print comp_list
これは下記コードと同じ処理内容です。
# -*- coding:utf-8 -*-
comp_list = []
for i in range(1, 10):
for ii in range(1, 10):
comp_list.append(i * ii)
print comp_list
--実行結果--
[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, …中略… 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]
if文と併用し、条件を設けることもできます。
# -*- coding:utf-8 -*- comp_list = [i for i in range(10) if i % 2 == 1] print comp_list
これは下記コードと同じ処理内容です。
# -*- coding:utf-8 -*-
comp_list = []
for i in range(10):
if i % 2 == 1:
comp_list.append(i)
print comp_list
--実行結果--
[1, 3, 5, 7, 9]
タプル内包表記はありません。リストやディクショナリと同じように記述することはできますが、下記のような場合はタプルではなく ジェネレータ が作成されます。
# -*- coding:utf-8 -*- gen = (i for i in range(10)) print gen
--実行結果--
<generator object <genexpr> at 0x000000000257B900>
変数の型のチェックも出来ますよ!
