実務でリストを使う場合、多くの場合が二次元配列であると思います。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の記事を発信していければなとおもっています。
コメント