プログラミングをしていると、オブジェクトの値を昇順や降順で並び替えを行う処理が必要な場合もあります。
「文字列の値を並び替えたい」
「取得したCSVの値を並び替えたい」
そこで今回は、Pythonでソートを行う方法をご紹介したいと思います。
【実践】リスト(list)のソート
【実践】セット(set)のソート
【実践】タプル(tuple)のソート
【実践】辞書(dict)のソート
【実践】文字列のソート
【実践】CSVファイルの中身をソートする方法
ここではさまざまなソート方法についてやさしく解説していきますので、ぜひ参考にしてください。
※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
なお、Pythonの記事については、こちらにまとめています。
Pythonのソート処理
ソートは、データの集まりを特定の規則に基づいて並べ替えることです。
例えば、int型のリストの要素を小さい順や大きい順に並び替えたい時に、ソートを行います。
Pythonでソート出来る型は、「リスト・セット・辞書・タプル・文字列」などです。
※sorted関数でソートすると、返り値は必ずリスト型になります。
Pythonではソートの方法としては以下の2つが用意されています。
ソート | 機能 |
---|---|
sortメソッド | リスト型メソッド ソート後リスト自身が並び替わる |
sorted関数 | 並べ替えたリストを戻り値として返す |
sortメソッドは、リスト型のメソッドです。
戻り値はなく、sortメソッドを使ったあと、リスト自身の並びが変わります。
一方、sorted関数は自身を変えずに並べ替えたリストを戻り値として返します。
ビルトイン関数であるsorted関数は、引数に並びを変えたいオブジェクトを指定します。
リストのソート
ここでは、リストの値を昇順・降順にそれぞれ並び替える方法について解説します。
こちらのコードをご覧ください。
sample = [2,8,1,4] sample.sort() print(sample)
実行結果
[1, 2, 4, 8]
こちらのコードでは、sortメソッドを使ってsampleリストを昇順で並び替えてみました。
続いて降順で並び替えてみましょう。
降順で並び替えるには、sortメソッドの引数に「reverse = True」を指定します。
sample = [2,8,1,4] sample.sort(reverse=True) print(sample)
実行結果
[8, 4, 2, 1]
今回はsortメソッドの引数に「reverse = True」を指定しました。
「reverse = True」を指定することによって、デフォルト設定である小さい順に並び替えるものから、大きい順に変更することができるのです。
sorted関数でも、同じ引数を指定する事が出来ます。
こちらのコードをご覧ください。
sample = [2,8,1,4] result = sorted(sample, reverse=True) print(result)
実行結果
[8, 4, 2, 1]
ご覧いただけるように、しっかりと大きい順に表示されましたね。
この場合も、sorted関数を使用したため、元のsampleリストは並び替えられていません。
セットのソート
セットとは、集合のことです。
リストとは違い、セットには順序が無く、重複した要素がないという特徴があります。
セットについての詳しい解説はこちらのリンクをご覧ください。
では、さっそくセットをソートしてみましょう。
こちらのコードをご覧ください。
myset = set([2,8,1,8,4,4]) result = sorted(myset) print(result)
実行結果
[1, 2, 4, 8]
返り値がリスト型になっていることに注意!
こちらのコードでは、まずmysetというセット型のオブジェクトを作成しました。
8と4の重複した要素がありますが、セットなので重複した要素は無視されています。
リストの時と同じように、sorted関数の引数にmysetを指定し、出力させました。
ご覧いただけるように、小さい順に並び替えられていますね。
タプルのソート
この章では、タプルのソートをご紹介します。
タプルとは、リストに良く似ているオブジェクトです。
しかしリストとは違って、要素の追加や削除ができないのがタプルの特徴です。
タプルについての詳しい解説はこちらのリンクをご覧ください。
https://www.sejuku.net/blog/23964
では、実際にタプルをソートしてみましょう。
こちらのコードをご覧ください。
mytuple = (2,8,1,4) result = sorted(mytuple) print(result)
実行結果
[1, 2, 4, 8]
上のコードでは、mytupleというタプル型のオブジェクトを、sorted関数を使用してソートしてみました。
ご覧いただけるように、とてもシンプルにソートすることが出来ましたね。
辞書のソート
では、辞書をソートしてみましょう。
辞書(dict)型オブジェクトは、keyとvalueをコロンで区切ったペアで構成されています。
辞書についての詳しい解説はこちらのリンクをご覧ください。
ではさっそく、こちらコードをご覧ください。
mydict = {3:"apple",1:"orange", 5:"banana"} result = sorted(mydict) print(result)
実行結果
[1, 3, 5]
上のコードでは、sorted関数の引数に辞書型のオブジェクトであるmydictを指定しました。
出力されたのは小さい順に並べられたkeyのみです。
valueも一緒に表示させたい場合は、以下のようにコード書きましょう。
result = sorted(mydict.items()) print(result)
実行結果
[(1, 'orange'), (3, 'apple'), (5, 'banana')]
上のコードでは、sorted関数の引数に指定したmydictにitemsメソッドを適用しました。
itemsメソッドは、mydictに含まれている(key, value)ペアを要素とするリストを返します。
文字列のソート
ここでは、文字列をソートする方法をご紹介したいと思います。
文字列に関しては、こちらの記事をご覧ください。
ではさっそく、実際に文字列をソートしてみましょう。
こちらのコードをご覧ください。
moji = ["2", "8", "1", "4"] result = sorted(moji, key = int) print(result)
実行結果
['1', '2', '4', '8']
上のコードでは、今までご紹介したサンプルコードとは少し違うものになっています。
実際、sorted関数の引数として「key = int」というものが追加されています。
int関数は、本来文字列である数字を整数に直すために必要なものです。
その為、文字列「moji」は整数としてソートされ、その後また文字列に変換しなおされているのです。
この方法は、文字列全般に対してではなく、数字が含まれた文字列にのみ有効なのでご注意ください。
以下の場合はアルファベットの文字列をソートしたい場合のサンプルです。
mojiretu= ["bbb", "ccc", "aaa", "ddd"] result = sorted(mojiretu) print(result)
実行結果
['aaa', 'bbb', 'ccc', 'ddd']
アルファベットの文字列をソートする場合は、sorted関数の引数に並び替えたいオブジェクトを指定すればOKです!
CSVファイルの中身をソートする方法
ここからはよく使うCSVファイルの中身をソートする方法について解説していきます。
CSV(Comma Separated Value)とは、カンマで値が区切られたテキストファイルのことです。
今回は、以下のsample.csvというとてもシンプルなCSVファイルを使用します。
ファイルの中には以下のように書き込みましょう。
81,Japan,Asia 39,Italy,Europe 1, Hawaii,Oceania 91,India,Asia
sample.csv は 4つの行で構成されており、行ごとに4つの国の国番号、国名、地域の情報が入っています。
これらを、国番号順に並び替えてみましょう。
以下のコードをご覧ください。
import sys, csv, operator mycsv = csv.reader(open('sample.csv'),delimiter=',') result = sorted(mycsv, key=operator.itemgetter(0)) print(result)
実行結果
[['1, "Hawaii", "Oceania"'], ['39, "Italy", "Europe"'], ['81, "Japan", "Asia"'], ['91, "India", "Asia"']]
上のコードでは、まずCSVファイルを扱うために必要なパッケージをインポートしました。
そしてcsv.readerを使用し、sample.csvファイルを開きます。
「delimiter=’,’」は、カンマで値が区切られていることを示すものです。
セミコロンなどで区切られている場合は、「delimiter=’;’」と指定しましょう。
そして、sorted関数を使用しソートを行います。
sorted関数の引数のkeyパラメータには「operator.itemgetter(0)」と指定されています。
これは、1列目(国番号)の要素をソートすることを意味します。
ご覧いただけるように、sorted関数の戻り値であるresultは、きちんと国番号順に表示されました。
では、ラストステップです。
国番号順に並び替えた新たなCSVファイルを作成しましょう。
以下のコードをご覧ください。
with open("sorted.csv", "w") as f: data = csv.writer(f, delimiter=',') for r in result: data.writerow(r)
上のコードでは、sorted.csvというファイルを書き込み設定で開きます。
sorted.csvが存在しない場合は、新規作成されます。
そして、先ほどのsorted関数の戻り値を格納したリスト型オブジェクトであるresultを使用し、sorted.csvに書き込んでいきます。
実際、sorted.csvを開いてみると以下の通りです。
1, Hawaii,Oceania 39,Italy,Europe 81,Japan,Asia 91,India,Asia
ご覧いただけるように、国番号順に並び替えられていますね。
まとめ
今回は、Pythonにおけるさまざまな型のソート方法をご紹介しました。
覚えておきたいポイントは
- sortメソッドはリスト型、sorted関数はその他にも適用!
- CSVファイルなども簡単にソート出来る
こんな感じですね。
皆さんも、この記事を通してソートに関する知識をどんどん深めて行ってくださいね。