0
0

More than 1 year has passed since last update.

Pythonで、我ながら下らないコードを書いてしまった(学習まとめ?)

Last updated at Posted at 2023-01-24

ふとある時、カタカナ単語を五十音順(≒辞書配列順)にソートしてくれる機能が欲しくなってコーディングし始めました。
しかし、よくよく調べてみたら、Pythonの配列に「sort」メソッドがあるではありませんか・・・(笑)。
とんだ「再発明」をしてしまいました・・・(泣)。
でもせっかくなので、自分で書いたコードをQiitaの記事にしてしまおうと考えたワケです(爆)。
よかったら、ご自分の環境で実行して(みるまでもないか)・・・。
(どうせ、「sort」メソッドとほとんど結果は変わらないし)。
もしも、Python標準の「sort」メソッドと挙動や結果が違う部分があったら報告してみてください。
(多分、変更しませんが・・・)。

kana_sort.py
# coding: utf-8




#各モジュールの読み込み
import sys
import numpy




#ソート処理する各文字列の最大の長さ
#(実際には、配列に1文字ずつ格納するので「1行分の要素数」と等価)
CHRS_MAX_NUM = 10

#日本語のカナ文字から一意の数値へと変換するための辞書
kana_to_num_dict = {"":1, "":2, "":3, "":4, "":5, "":6, "":7, "":8, "":9, "":10, \
"":11, "":12, "":13, "":14, "":15, "":16, "":17, "":18, "":19, "":20, \
"":21, "":22, "":23, "":24, "":25, "":26, "":27, "":28, "":29, "":30, \
"":31, "":32, "":33, "":34, "":35, "":36, "":37, "":38, "":39, "":40, "":41, \
"":42, "":43, "":44, "":45, "":46, \
"":47, "":48, "":49, "":50, "":51, "":52, "":53, "":54, "":55, "":56, "":57, "":58, "":59, "":60, "":61, \
"":62, "":63, "":64, "":65, "":66, \
"":67, "":68, "": 69, "":70, "":71, "":72, \
"":73, "":74, "":75, "":76, "":77, \
"":78, "":79, "":80, \
"":81, "*":99}

#一意の数値から日本語のカナ文字へと変換するための辞書
num_to_kana_dict = {1:"", 2:"", 3:"", 4:"", 5:"", 6:"", 7:"", 8:"", 9:"", 10:"", \
11:"", 12:"", 13:"", 14:"", 15:"", 16:"", 17:"", 18:"", 19:"", 20:"", \
21:"", 22:"", 23:"", 24:"", 25:"", 26:"", 27:"", 28:"", 29:"", 30:"", \
31:"", 32:"", 33:"", 34:"", 35:"", 36:"", 37:"", 38:"", 39:"", 40:"", 41:"", \
42:"", 43:"", 44:"", 45:"", 46:"", \
47:"", 48:"", 49:"", 50:"", 51:"", 52:"", 53:"", 54:"", 55:"", 56:"", 57:"", 58:"", 59:"", 60:"", 61:"", \
62:"", 63:"", 64:"", 65:"", 66:"", \
67:"", 68:"", 69:"", 70:"", 71:"", 72:"", \
73:"", 74:"", 75:"", 76:"", 77:"", \
78:"", 79:"", 80:"", \
81:"", 99:"*"}

#「kana_wrds」という名前のNumpy形式の配列を操作するための添字
#(「while」文の中で用いる)
i = 0
j = 0

#「kana_wrds」という名前のNumpy形式の配列を操作するための添字
#(「for」文の中で用いる)
item_num  = 0
items_num = 0

#コマンドライン引数が代入されるNumpy形式の配列
argv = numpy.empty((len(sys.argv)-1, CHRS_MAX_NUM), dtype=object)

#「argv」の内容が1文字づつコピーされて、かつ、カナから数値へと変換されて格納される配列
kana_wrds = numpy.empty((len(sys.argv)-1, CHRS_MAX_NUM), dtype=object)

#Numpy形式の配列の行を交換するための一時的な配列
swap_row1 = []
swap_row2 = []

#配列に1文字づつ格納されている各文字を連結するためのもの
kana_str = ""

#文字数をカウントするためのもの
chrs_cnt = 0

#最終的な結果を格納するための配列
kana_wrds_final = []




if len(sys.argv)-1 == 0:
    print("コマンドライン引数が無いです。最少でも2個以上入力してください。")
    sys.exit(1)

if len(sys.argv)-1 == 1:
    print("コマンドライン引数が少ないです。最少でも2個以上入力してください。")
    sys.exit(1)

for items in sys.argv:
    for item in items:
        if (i > 0):
            argv[i-1][j] = item
        j += 1
    else:
        i += 1
        j  = 0
else:
    i = 0
    j = 0

for items in argv:
    for item in items:
        kana_wrds[i][j] = item
        j += 1
    else:
        i += 1
        j  = 0

numpy.putmask(kana_wrds, kana_wrds == None, "*")

for items in kana_wrds:
    for item in items:
        try:
               kana_wrds[items_num][item_num] = kana_to_num_dict[item]
        except KeyError:
               print("対応していない文字が入力されています。")
               sys.exit(1)
        except IndexError:
               print("文字数の制限を超えて入力されています。")
               sys.exit(1)
        item_num  += 1
    else:
        item_num = 0
        items_num += 1
else:
    item_num  = 0
    items_num = 0

print("----------------------------------------------------------------------")
print(kana_wrds)
print("----------------------------------------------------------------------")

i = 0
j = kana_wrds.shape[1]-1
while j > -1:
      while i+1 < kana_wrds.shape[0]:
            if (kana_wrds[i][j] != 99 and kana_wrds[i+1][j] != 99):
                if kana_wrds[i][j] > kana_wrds[i+1][j]:
                   print("swap!")
                   print(kana_wrds[i])
                   print(kana_wrds[i+1])
                   swap_row1      = kana_wrds[i].copy()
                   swap_row2      = kana_wrds[i+1].copy()
                   kana_wrds[i+1] = swap_row1
                   kana_wrds[i]   = swap_row2
                   print(kana_wrds[i])
                   print(kana_wrds[i+1])
                   i = 0
                   continue

                if kana_wrds[i][j] < kana_wrds[i+1][j]:
                   print("pass...")
                   i += 1
                   continue

                if kana_wrds[i][j] == kana_wrds[i+1][j]:
                   print("pass...")
                   i += 1
                   continue

            if (kana_wrds[i][j] != 99 and kana_wrds[i+1][j] == 99):
                print("swap!")
                print(kana_wrds[i])
                print(kana_wrds[i+1])
                swap_row1      = kana_wrds[i].copy()
                swap_row2      = kana_wrds[i+1].copy()
                kana_wrds[i+1] = swap_row1
                kana_wrds[i]   = swap_row2
                print(kana_wrds[i])
                print(kana_wrds[i+1])
                i = 0
                continue

            if (kana_wrds[i][j] == 99 and kana_wrds[i+1][j] != 99):
                print("pass...")
                i += 1
                continue

            if (kana_wrds[i][j] == 99 and kana_wrds[i+1][j] == 99):
                print("pass...")
                i += 1
                continue
      else:
            i = 0
            j -= 1

print("----------------------------------------------------------------------")
print(kana_wrds)
print("----------------------------------------------------------------------")

for items in kana_wrds:
    item_num = 0
    for item in items:
        kana_wrds[items_num][item_num] = num_to_kana_dict[item]
        item_num  += 1
    else:
        items_num += 1

for items in kana_wrds:
    for item in items:
        if item != "*":
           kana_str += item
        if (item == "*" and kana_str == ""):
           break
        if chrs_cnt == kana_wrds.shape[1]-1:
           kana_wrds_final.append(kana_str)
           kana_str = ""
           chrs_cnt = 0
           break
        chrs_cnt += 1

print(kana_wrds_final)

念のため、実行用のWindowsバッチファイルも載せておきます。

appexcec__kana_sort.bat
cd C:\Users\name\Documents←「name」=ご自身の名前。
chcp 65001←コマンドプロンプト上の文字コード変更。
py kana_sort.py ギョーザ ギヨウザ ギョザ ギョウザ←この要領で引数を与えてやります。
pause←これがないと実行し始めてから一瞬でウインドウが消えてしまいます。

いかがでしたでしょうか?。
PYthon標準の「sort」メソッドであれば、当然、文字コードを使っているはずです。
しかし、筆者は文字コードのことはチンプンカンプンなので、独自の文字コード(?)を使って実装してみました。
また、懲りずに記事を書いていきたいと思います。
それではまた~。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0