Pandas を使用しないソート
GO とほとんど変わらないコードとなりました。
import csv def getposi(elements, left, right): pivot1 = elements[right][0] pivot2 = elements[right][1] i = left for j in range (left, right): if elements[j][0] < pivot1: swap(elements[i],elements[j]) i += 1 elif elements[j][0] == pivot1: if elements[j][1] < pivot2: swap(elements[i],elements[j]) i += 1 swap(elements[i],elements[right]) return i def swap(elements1, elements2): for j in range (0, len(elements1)): temp = elements1[j] elements1[j] = elements2[j] elements2[j] = temp def quicksort(elements, left, right): if left < right: posi = getposi(elements, left, right) quicksort(elements, left, posi-1) quicksort(elements, posi+1, right) def main(): filename = './input.csv' with open(filename, "r", encoding="shift-jis", newline='') as f: csvreader = csv.reader(f) elements = [row for row in csvreader] quicksort(elements, 0, len(elements)-1) filename = './output.csv' with open(filename, 'w', encoding="shift-jis", newline='') as f: csvwriter = csv.writer(f) csvwriter.writerows(elements) main()
ただ、出力されるまでに20数秒要しています。
NumPy を使わないと時間がかかるようです。
しかし、令和4年8月23日投稿の「VBAでクイックソート その2」では40秒かかっているので、Python はかなり早いといえます。
CSV ファイルの読み込み
input.csv をエンコードを指定して読み込みます。
scv.reader は与えられファイル内の行を反復処理するような reader オブジェクトを返します。
そして、そのオブジェクトから内包表記でリストを作成します。
import csv
filename = './input.csv'
with open(filename, "r", encoding="shift-jis", newline='') as f:
csvreader = csv.reader(f)
elements = [row for row in csvreader]
elements
そのリストを見てみると次の画像のようになっています。
この画像は、JupyterLab の作業の途中のものです。
elements がリストを入れ子にしたリストであることが分かります。
こうなれば、2次元のリストのアクセスで処理ができますので、GO の場合の処理と全く同じになります。