
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 の場合の処理と全く同じになります。