Table of contents
内包表記と高階関数
Pythonではリストを変換する手段としてリスト内包表記を使う方法と、map、filterなどの関数を引数とする、高階関数を使う方法があります。
一般に内包表記の方が高速で動作すると言われていて、公式でも内包表記が推奨されています。
とはいえ、他の言語でmapやfilterなどの高階関数を使ったことがある場合は、こちらのほうがわかりやすいでしょう。 ここではなるべく両方のやり方を書いていきます。
要素の存在チェック
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!
要素を検索して場所を返す
要素に特定の値が現れる場所を求めるには、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
検索して一致した全ての場所を取り出すのは、以下のように内包表記を使うと簡単にできます。
resultList = [i for (i,x) in enumerate(testList) if x == 1 ]
結果
[1, 3]
enumerateは、インデックスと要素のタプルを返す関数です。
リスト内包表記を使う
testList = [1,2,3,4,5,6] resultRist = [x for x in testList if x > 3] print resultRist
結果
[4, 5, 6]
高階関数filterを使う
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
リスト内包表記を使う
testList = [1,2,3,4,5,6] resultRist = [2 * x for x in testList] print resultRist
結果
[2, 4, 6, 8, 10, 12]
高階関数mapを使う
全要素を変換する場合はmapを使います。
testList = [1,2,3,4,5,6] resultList = map(lambda x : x * 2, testList) print resultList
ここでmapの第一引数は引数を二倍にするラムダ式です。
結果
[2, 4, 6, 8, 10, 12]
リスト内包表記
testList = [1,2,3,4,5,6] resultRist = [2 * x for x in testList if x > 3] print resultRist
結果
[8, 10, 12]
Page Info | |
---|---|
Page Name : | Python/リストの検索と変換 |
Page aliases : | None |
Page owner : | njf |
Can Read | |
Groups : | All visitors |
Users : | All visitors |
Can Edit | |
Groups : | All visitors |
Users : | All visitors |
Counter: 1844,
today: 1,
yesterday: 0
Princeps date: 2016-12-04 (Sun) 08:58:28
Last-modified: 2016-12-04 (Sun) 10:59:46 (JST) (2484d) by njf