Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

Python でソート 2

Pandas を使用しないソート

GO とほとんど変わらないコードとなりました。

copy

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