ページへ戻る

− Links

 印刷 

Python​/リストの検索と変換 :: NJF Wiki

xpwiki:Python/リストの検索と変換

ページ内コンテンツ
  • 内包表記と高階関数
  • 要素の存在チェック
  • 要素を検索して場所を返す
  • 検索した要素をリストで取得
    • リスト内包表記を使う
    • 高階関数filterを使う
  • 要素を変換する
    • リスト内包表記を使う
    • 高階関数mapを使う
  • 要素を検索して変換する
    • リスト内包表記
    • 高階関数を組み合わせる
  • まとめ

内包表記と高階関数 anchor.png[1] Edit [2]

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

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

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

Page Top

要素の存在チェック anchor.png[3] Edit [4]

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[5] Edit [6]

要素に特定の値が現れる場所を求めるには、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編集[7]が発生します。

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

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

結果

[1, 3]

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

Page Top

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

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

Page Top

リスト内包表記を使う anchor.png[10] Edit [11]

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[12] Edit [13]

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

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

print resultList

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

結果

[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[15] Edit [16]

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

Page Top

リスト内包表記を使う anchor.png[17] Edit [18]

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[19] Edit [20]

全要素を変換する場合は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[21] Edit [22]

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

Page Top

リスト内包表記 anchor.png[23] Edit [24]

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[25] Edit [26]

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[27] Edit [28]

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

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


Last-modified: 2016-12-04 (日) 10:59:46 (JST) (2700d) by njf