並び替え
練習問題を解いていく時に、大小判断、並び替えは必須のタスクです。
並び替えにはsorted
pythonでは、何か特別なルーチンを組まなくてもsorted関数を使えば一発で解決します。
>>> target_list = [2,3,1,1,4,5,3,2,4]
>>> sorted(target_list)
[1, 1, 2, 2, 3, 3, 4, 4, 5]
昇順?降順?
sorted関数は、デフォルトでは昇順(小さいものから大きいものへ)で並べ替えてくれます。降順(大きいものから小さいものへ)で並べるためには、引数reverseにTrueを設定しましょう。
>>> target_list = [2,3,1,1,4,5,3,2,4] >>> sorted(target_list, reverse=True) [5, 4, 4, 3, 3, 2, 2, 1, 1]
各要素に複数の要素があっても大丈夫
文字列のリストをソートしてみましょう。
>>> target_list = ["abdcd", ”abcbd”]
>>> sorted(target_list)
['abcbd', 'abdcd']
このように文字列の比較を行った場合、一文字目から順に比べていき、どちらかが大きければ、そちらが大きいと判定され、同じならば、次の文字を比べるという処理を繰り返して行きます。
これと同様に、複数要素をもつタプルを要素とするリストをソートする事も出来ます。
>>> target_list = [(1,2,5,1),(1,2,3,4)]
>>> sorted(target_list)
[(1, 2, 3, 4), (1, 2, 5, 1)]
何で比べるのかを指定する
「辞書オブジェクトを使ってなんでも数える」 で紹介しているように、数を数える時に辞書オブジェクトが良く用いられます。
例えば、動物の数を数えた結果として次の辞書オブジェクトresult_dictが得られたとします。ここで、辞書オブジェクトにitemsメソッドを使うことで簡単にkeyとvalueをペアとしたタプルのリストに変換することが出来ます。タプルのリストなら、上述の通り、sortedで並び替えが出来ます。
(辞書オブジェクトをそのままsorted関数に入れると、keyのみを取り出して、並び替えたリストが戻されだけなので、意図する処理が行えません)
>>> result_dict
{'bird': 2, 'cat': 3, 'dog': 5, 'horse': 1}
>>> my_list = list(result_dict.items())
>>> my_list
[('bird', 2), ('cat', 3), ('dog', 5), ('horse', 1)]
さて、しかしながら、上述の通りsorted関数は、各要素の中身が複数の要素を持っていても並び替えをしてくれますが、その比べ方は、単純に個々の要素の先頭から判定していくだけです。ですから、my_listをsortedに掛ければ、動物の名前のアルファベット順に並び替えが行われます。
では、その動物の数である各要素の2番目の要素で比べたい時はどうするのでしょうか。
keyパラメータに関数を指定する
sorted等の比較を行う関数には、keyパラメータという引数があります。そして、このkeyパラメータに関数を指定すると、その関数が比較を行う前に各要素に対して呼び出されます。
すなわち、ここに一つの引数をとって、比較すべき何かを返り値にする関数を設定することで、何で比べるのかを自由に設定することが出来るのです。
>>> # keyを設定しないとき ... sorted(my_list) [('bird', 2), ('cat', 3), ('dog', 5), ('horse', 1)] >>> # keyを設定した時 ... sorted(my_list,key=lambda x: x[1]) [('horse', 1), ('bird', 2), ('cat', 3), ('dog', 5)]
オブジェクトを与えると2番目の要素を返す関数を無名関数で定義してkeyパラメータに渡しています。こうすることで、大小比較は、二番目の要素のみで行われるようになります。
混乱してはいけないのは、sorted自体の戻り値は、元の要素を並べ替えたリストが返ります。keyに設定された関数の戻り値を並べ替えたリストではありません。
sortedとsort
sortedに似た、並び替えの関数にsortがあります。
>>> my_list = [3,2,4,5,3,2,5,6,1] >>> my_list.sort() >>> my_list [1, 2, 2, 3, 3, 4, 5, 5, 6]
上記で見る通り、sortは以下の点でsortedと異なっています。
- 対象オブジェクトであるリストのメソッドとして(ドットで繋いで)使います。
- 戻り値としてNoneが返ります
- 元のリストオブジェクトそのものの中身を並び替えて変更します。
注目すべきは3番目で、元のオブジェクトを書き換えてしまう点に注意が必要です。
最大、最小を調べる
max関数やmin関数を使う際にも、上記と同様に、各要素に複数要素がある場合の問題解決方法が妥当します。
もっと知りたい
Pythonドキュメントに「ソート How To」というページがあります。
https://docs.python.jp/3/howto/sorting.html
Keyパラメータには、よく無名関数(ラムダ関数)が使われたりしますが、上述のように、何番目の要素で比較というタスクは良くあるパターンなので、Pythonにはオペレータモジュールの関数が用意されているという部分は注目です。
並び替え
Reviewed by shunsk
on
7/04/2018
Rating:
No comments: