内包表記(リスト)のソース例
解説をするよりもまずはソース例を見た方が
わかりやすいと思うので書いてみます。
inclusion.py
#通常表記
a = [9, 2, 3, 4, 8]
a_db = []
for x in a:
a_db.append(x*2)
#内包表記
a = [1, 2, 3, 4, 5]
a_db = [x*2 for x in a]
内包表記はpython特有の機能
少なくともphpやその他メジャーな言語では
現時点ではなさそうです。
ざっと検索したところjavascriptでは
数種類の内包表記があったらしく非推奨になっておりました。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Array_comprehensions
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Generator_comprehensionsES6では新規に内包表記が追加されているので
他の言語でも今後実装されてくる可能性は0ではなさそうですね。#内包表記はイテラブルなオブジェクトから新しいデータを作る
イテラブルとはリスト、文字列、タプル、辞書などの
要素を順番にとりだせるもののことを言います。
内包表記はイテラブルなオブジェクトから新しいデータ構造を作ることができます。
条件を付与(リストの内包表記条件付き)
内包表記には条件をつけることも可能です。
Conditions.py
#通常
a = [1, 2, 21, 30, 53]
a_db = []
for x in a:
if x >= 20:
a_db.append(x*2)
#内包表記
a = [1, 2, 21, 30, 53]
a_db = [x*2 for x in a if x >= 20]
#条件付きリスト内包表記の構文
{式 for 変数 in イテラブルなオブジェクト if 条件式}
辞書の内包表記
以下は辞書からkeyだけを取り出して
ランダムに値を付与するというもの。
dictionary.py
#辞書の内包表記
from random import randint
keys = ['辞書', 1, '文庫', 8, '漫画']
d = { x:randint(1, 100) for x in keys if type(x) == str}
print(d)
#実行結果
#{'辞書':88, '文庫':32, '漫画':43}
#辞書の内包表記の構文
{ キー:値 for 変数 in イテラブルなオブジェクト if 条件式 }
集合の内包表記
集合に関しては同じ値を無視するという性質がある。
set.py
a = {2, 1, 5, -3, 5, -1, 10, 9, 13, 3, -5
setA = { x for x in a if (0 < x <= 10)}
#実行結果
#{2, 1, 5, 10, 9, 3}
#集合の内包表記の構文
{ 式 for 変数 in イテラブルなオブジェクト (if 条件式) }
ジェネレータを内包表記で書くこともできます
javascriptでは非推奨になっていたジェネレータの内包表記ですが
pythonは標準で書くことが可能です。
generatorexpression.py
g = (x for x in range(5))
#ちなみに以下のtはリストになります。
t = [x for x in range(5)]
以下は実行結果となります。
excusionresultgeneratorexpression.py
>>> g = (x for x in range(3))
>>> print(next(g))
0
>>> print(next(g))
1
>>> print(next(g))
2
>>> print(next(g))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration