内包表記と高階関数 anchor.png Edit

Pythonではリストを変換する手段としてリスト内包表記を使う方法と、map、filterなどの関数を引数とする、高階関数を使う方法があります。

一般に内包表記の方が高速で動作すると言われていて、公式でも内包表記が推奨されています。

とはいえ、他の言語でmapやfilterなどの高階関数を使ったことがある場合は、こちらのほうがわかりやすいでしょう。 ここではなるべく両方のやり方を書いていきます。

Page Top

要素の存在チェック anchor.png Edit

Pythonで特定の要素が存在するかは、「in」を用います。

testList = [1,2,3,4,5,6]

if 1 in testList:
    print "1 exists!"

if 10 in testList:
    print "10 exists!"

結果

1 exists!
Page Top

要素を検索して場所を返す anchor.png Edit

要素に特定の値が現れる場所を求めるには、indexを使います。 第二引数を省略すると最初の場所が返ります。

testList = [2,1,3,1,5,6]

print testList.index(1)

結果

1

indexの第二引数、第三引数に整数を入れると、その区間にある要素の最初の場所が返ります。第三引数を省略するとリストの最後まで指定したことになります。

testList = [2,1,3,1,5,6]

print testList.index(1,2,5)

結果

3

要素がないとValueError編集が発生します。

検索して一致した全ての場所を取り出すのは、以下のように内包表記を使うと簡単にできます。

resultList = [i  for (i,x) in enumerate(testList) if x == 1 ]

結果

[1, 3]

enumerateは、インデックスと要素のタプルを返す関数です。

Page Top

検索した要素をリストで取得 anchor.png Edit

例として3以上の要素をリストで取得する方法を考えます。

Page Top

リスト内包表記を使う anchor.png Edit

testList = [1,2,3,4,5,6]

resultRist = [x for x in testList if x > 3]

print resultRist

結果

[4, 5, 6]
Page Top

高階関数filterを使う anchor.png Edit

testList = [1,2,3,4,5,6]

resultList = filter(lambda x : x > 3, testList)

print resultList

ここで第一引数は真偽型を戻り値とする関数です。ここではラムダ式で3より大きい時に真となる関数を定義しています。ラムダ式については「Python​/ラムダ式」を参照のこと

結果

[4, 5, 6]

ラムダ式の部分はもちろん関数でもかまいません。ただし簡単な物ならラムダ式の方がコンパクトに書けます。以下の物は上の例と全く同じ結果を返します。

def filterFunction(x):
    return x > 3

testList = [1,2,3,4,5,6]
 
resultList = filter(filterFunction, testList)
 
print resultList
Page Top

要素を変換する anchor.png Edit

例として全要素を2倍にする処理を考えます。

Page Top

リスト内包表記を使う anchor.png Edit

testList = [1,2,3,4,5,6]

resultRist = [2 * x for x in testList]

print resultRist

結果

[2, 4, 6, 8, 10, 12]
Page Top

高階関数mapを使う anchor.png Edit

全要素を変換する場合はmapを使います。

testList = [1,2,3,4,5,6]

resultList = map(lambda x : x * 2, testList)
print resultList

ここでmapの第一引数は引数を二倍にするラムダ式です。

結果

[2, 4, 6, 8, 10, 12]
Page Top

要素を検索して変換する anchor.png Edit

例として3より大きな要素を二倍することを考えます。

Page Top

リスト内包表記 anchor.png Edit

testList = [1,2,3,4,5,6]

resultRist = [2 * x for x in testList if x > 3]

print resultRist

結果

[8, 10, 12]
Page Top

高階関数を組み合わせる anchor.png Edit

mapとfilterを組み合わせれば、同じことができます。

testList = [1,2,3,4,5,6]

resultList =  map(lambda x : x * 2, filter(lambda x : x > 3, testList))

print resultList

結果

[8, 10, 12]
Page Top

まとめ anchor.png Edit

全体に簡単な処理ならリスト内包表記の方がコンパクトに書けて、しかも高速なので便利です。

複雑な処理の場合は、別に関数を定義する高階関数の方がループ構造と処理が分かれるのでわかりやすいかもしれません。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 338, today: 1, yesterday: 1
初版日時: 2016-12-04 (日) 17:58:28
最終更新: 2016-12-04 (日) 19:59:46 (JST) (349d) by njf
広告

ログイン

ユーザー名:


パスワード:





パスワード紛失


NJF