以下、自分用のメモです。
概要
pythonといえば、「リスト内包表記(list comprehension)」が有名ですが
リストだけじゃなくて、辞書にも集合にも内包表記があります。
リスト内包表記
[ expression for item in iterable]
辞書内包表記
{ key_item: value_item for item in iterable }
集合内包表記
{ item for item in iterable }
タプル内包表記??
実は、タプルの内包表記はありません。
() で囲めばいいんじゃね?って思うのですが
実際にやると
obj = (item for item in range(5)) print(type(obj))
<class 'generator'>
ってなります。()で囲むと「ジェネレータ内包表記」となります。
サンプル
# # 内包表記 # 内包表記 (comprehension) は、一つ以上のイテレータから # Pythonデータ構造をコンパクトに生成出来る形式。 # # 内包表記には以下が存在する。 # ・リスト内包表記 # ・辞書内包表記 # ・集合内包表記 # ・ジェネレータ内包表記 # タプルの内包表記は存在しない # seq01 = tuple(range(10)) # # リスト内包表記 # 以下の形式となる # # [ expression for item in iterable [if condition] ] # pr('list-comprehension', [x ** 2 for x in seq01 if x < 5]) # 2つのシーケンスを使う内包表記も可能 seq02 = tuple(range(10, 20)) pr('list-comprehension', [(x, y) for x in seq01 for y in seq02]) # # 辞書内包表記 # 以下の形式となる # # { key_item: value_item for item in iterable } # str01 = 'hello world' pr('dict-comprehension', {c: str01.count(c) for c in str01}) # 上の処理では、同じ文字が存在する場合に同じエントリに対して上書きしているので # 少しだけ無駄となる。最適化すると以下のように出来る pr('dict-comprehension', {c: str01.count(c) for c in set(str01)}) # # 集合内包表記 # 以下の形式となる # # { item for item in iterable } # pr('set-comprehension', {c for c in str01}) # # ジェネレータ内包表記 # 以下の形式となる # # ( item for item in iterable ) # # 注意点:ジェネレータは一度しか利用できない gen01 = (c for c in set(str01)) pr('generator-comprehension', type(gen01)) for x in gen01: pr('generator', x)
ソースは、以下でも見れます。
以下、参考にした情報です。
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場