python|二次元配列にフィルターをかける最も簡単な方法

実務でリストを使う場合、多くの場合が二次元配列であると思います。3次元以上の配列は研究や開発の分野では使うかもしれませんが、事務職・技術職の会社員が仕事で使うのは大抵が二次元です。この記事では二次元配列(二次元リスト)に、Excelのフィルター機能のようにフィルターをかける方法を紹介します。

  • 一般用途で扱うことの多い「二次元配列(リスト)」が対象
  • Excelのフィルター機能のような、「抽出」を一番簡単に行う方法

完成品イメージと完成コード

実際に完成品です。

わずか一行で実装できます。

my_list = [
    ["カワウソ", "さくら"],
    ["カワウソ", "こたろう"],
    ["柴犬", "おにぎり"],
    ["猫","こたちゃ"],
    ["柴犬", "ぷんちゃん"],
    ["猫","よちひこ"],
    ["柴犬", "シバちゃん"],
]
list1 = list(filter(lambda x: x[0]=="カワウソ", my_list))
list2 = list(filter(lambda x: x[0]=="柴犬", my_list))
list3 = list(filter(lambda x: x[0]=="猫", my_list))
print(list1)
print(list2)
print(list3)
# 結果
# [['カワウソ', 'さくら'], ['カワウソ', 'こたろう']]
# [['柴犬', 'おにぎり'], ['柴犬', 'シバちゃん'], ['柴犬', 'ぷんちゃん']]
# [['猫', 'よちひこ'], ['猫', 'こたちゃ']]

1.そもそも二次元配列(二次元リスト)とは?

二次元配列とは、リストの中にリストを持っている状態のことを指します。

pythonでは、[]で作成できる配列を「リスト」と呼ぶので、二次元リストと呼んでも差し支えないでしょう。

次の例は、単純なリストの例です。

どのpythonの入門書を読んでも必ず出てきます。

# 一次元リスト
List1 = ["カワウソ","さくら"]
print(List1)
# 結果
# ['カワウソ', 'さくら']

次の例が、二次元リストの例です。

リストの中にリストを入れる、これで二次元になります。

# 二次元リスト
PreList1 = ["カワウソ","さくら"]
PreList2 = ["柴犬","おにぎり"]
List2 = [PreList1,PreList2]
print(List2)
# 結果
# [['カワウソ', 'さくら'], ['柴犬', 'おにぎり']]

二次元リストは、行列をpythonで扱う際によく使います。

行列というと数学みたいですが、ExcelやCSVのデータは行列です。システムやアプリケーションからダウンロードしたCSV、手作業で整理したExcelデータ、これらは行列データになります。行列データをpythonで扱う場合は、二次元リストが一番に考えられます。

世間に広く浸透しているExcelのデータが行列であるため、pythonで二次元リストを扱う機会はとても多いです。

2.filter関数の解説

具体的なコードの解説をします。

list1 = list(filter(lambda x: x[0]=="カワウソ", my_list))

この一行の中には「filter」「lamda」「list」の三つの関数を使っています。

このうちfilter関数はこちらの記事でも詳しく解説されています。

  • 第一引数・・・条件を表す関数
  • 第二引数・・・フィルターをかけたいlist

この二つの引数を指定ししてリストにフィルターをかけます。

フィルター関数を簡単な例です。

my_list = [
    ["カワウソ", "さくら"],
    ["カワウソ", "こたろう"],
    ["柴犬", "おにぎり"],
    ["猫","こたちゃ"]
    ["柴犬", "ぷんちゃん"],
    ["猫","よちひこ"],
    ["柴犬", "シバちゃん"],
]
# 関数 x[0]が"カワウソ"の時はTrueを、"カワウソ"でない時はFalseを返す。
def my_func (x): 
    return x[0] == "カワウソ"
#悪い例、これだとオブジェクトが返されるだけ。
print(filter(my_func, my_list))
#良い例、これだとリストが変えされる。
print(list(filter(my_func, my_list)))
# 結果
#<filter object at 0x7f240ef21610>
#[['カワウソ', 'さくら'], ['カワウソ', 'こたろう']]

「def my_func」のところで、フィルターに使う関数を定義します。

リストの一列目が”カワウソ”の時にTrueを返す関数にしました。

出力部分は

一個目「悪い例」でもできそうな気がしますが、これですとfilterのコレクションが変えされるだけです。

二個目の「良い例」のように、list関数に入れることで初めてリストになります。

3.lambda関数の解説

前章の内容でも、フィルターをかけること自体は可能ですが、前もって「def my_func」定義するのはなかなか面倒ですね。

ただフィルターをかけたいだけなので、もう少し簡略化してみます。

そこでlambda関数を使います。lambda関数についてはこちらの記事で紹介されています。

ここに関しては、筆者の理解不足で「簡単な例」が書けませんでした。

何はともあれ、lambda関数はdefで関数を定義するところを簡略化できるようです。

最後に

この記事では二次元配列に簡単にフィルターをかける方法を紹介しました。

openpyexという外部ライブラリを使い、pythonでExcelを扱う方法は広まっています。

しかしVBAでExcelを扱うことを考えると、まだまだ出始めの技術です。

今回のフィルタをかける方法も、解説している記事がなく、なかなか答えにたどりつけませんでした。

今後もこういったpythonの記事を発信していければなとおもっています。

コメント

タイトルとURLをコピーしました