Python 3.0 Hacks
第8回 リスト処理と内包表記
リスト処理関数の仕様変更
Python3.
iteratorへの変更
まずは,
リスト1 リスト処理関数
print(range(10)) # range
print(map((2).__mul__, range(10))) # map
print(filter(lambda x: x % 2, range(10))) # filter
print(zip(range(5), range(5, 10))) # zip
d = dict(aa=100, bb=300)
print(d.keys()) # dict.keys
print(d.values()) # dict.values
print(d.items()) # dict.items
結果は次のリスト2,
リスト2 python2.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[1, 3, 5, 7, 9]
[(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]
['aa', 'bb']
[100, 300]
[('aa', 100), ('bb', 300)]
リスト3 python3.
range(0, 10)
<map object at 0xb7bdd74c>
<filter object at 0xb7bdd74c>
<zip object at 0xb7bdd74c>
<dict_keys object at 0xb7bbaac4>
<dict_values object at 0xb7bbaac4>
<dict_items object at 0xb7bbaac4>
Python2.
2.
これら関数/
表1 Python 3.
iteratorを返すようになった関数 | 廃止された関数 |
---|---|
range | xrange |
map | itertools. |
filter | itertools. |
zip | itertools. |
dict. |
dict. |
dict. |
dict. |
dict. |
dict. |
その他のリスト処理関数
iteratorを返すように変更された上記関数以外にも,
list.
それともう一つ,
内包表記
リスト処理関数以外にリスト処理を行う際に使われるのが,
カウンタ変数のスコープ
まずはリスト4の例を実行してみてください。
リスト4 内包表記の例
x = 'some string'
print(x)
[x for x in range(100)]
print(x)
Python2.
リスト5 Python2.
some string
99
リスト6 Python3.
some string
some string
Python2.
この挙動はリスト内包表記を使った時のみの挙動で,
リスト7 generator式とスコープ
x = 'some string'
print(x)
list(x for x in range(100))
print(x)
内包表記の追加
Python2.
リスト8 set
# set を生成する内包表記
{x for x in iterable if x is not None}
# 2.x では以下のように書けば同様の結果を得られる
set(x for x in iterable if x is not None)
リスト9 dict
# dict を生成する内包表記
{x:func(x) for x in iterable}
# 2.x では以下のように書けば同様の結果を得られる
dict((x, func(x)) for x in iterable)
内包表記は非常に便利ではありますが,
まとめ
今回は,
バックナンバー
Python 3.0 Hacks
- 最終回 Python 3.0座談会(動画つき)
- 第11回 標準になったjsonモジュール
- 第10回 argument"s" clinic
- 第9回 Python3にもC拡張モジュールを─Python3.0でも使える拡張モジュール開発手法の確立
- 第8回 リスト処理と内包表記
- 第7回 関数アノテーションでスマートにプラスアルファの実現
- 第6回 Pythonicな文字列フォーマットforamat()メソッド
- 第5回 multiprocessingモジュールによるプロセス間通信
- 第4回 「俺様プチencoding」を実装して理解するPython3.0のioとcodec,encodingの機構
- 第3回 turtleモジュールで図と戯れる