[開発ログ]翌日-Pythonでこちらを探索


今日やったこと
  • 済州及び島山区を区切る構想
  • 図書山岳地帯はどのように区分します
    一般的に宅配便と呼ばれる場合、図書の山間部では値上げと書かれています.しかし、これをどのように区別するか知りたいです.apiはありますか?
    実際にapiは提供されていません.図書の山間の基準には規定の基準がないからだ.そのため、ある宅配会社が使用する図書の山間標準表で区別することにした.(どうせ宅配便で送ったんだから)
    図書山間dbには、郵便番号、住所、済州島(チェジュド)、図書山間の有無のコラムがある.
    私たちaddress型番に郵便番号フィールドがないのは、道理で...
    Pikifarmのアドレス入力は、以下の郵便番号apiを使用します.(名前から郵便番号apiですが、これはわかりません)ユーザーが住所を入力して選択すると、郵便番号を含む各種データが渡され、これらの郵便番号を図書山間dbと照合して正しいかどうかを判断します.
    最終的にこれはどのようにコードで表されるかの問題です.
    論理は理論的には簡潔だが、それをコードに変換するには、いくつかの悩みがある.
    図書山間dbはcsv形式で格納され,zipcodeはパラメータとして図書山間dbを出力できると仮定する.二つの方法が考えられる
  • 各関数の呼び出しに使用pandascsvの読み出し
  • csv zipcodeのみ抽出してコードに格納するlist
  • 1番は書類管理に向いていると思いますが、2番は演技面で有利だと思い始めました.
    だから最終的に2番を選んだのは、以下の理由からです.
  • 島山間dbは新しい山や島がない限り変わらない.
  • 関数を呼び出すたびに使うpandas読み出しのオーバーヘッドが大きい
  • きれいにするために、、、
    図書山間dbには約8000個のrowがある.しかしZipcodeは重複することが多い.これにより、重複除外後、約1300行削減される.
    リストに格納するのに十分だと思いますが、問題はどのように簡潔に表示するかです.
    1300行のリストを関数論理とともに入れると、可読性が損なわれる可能性があります.importゲートは変数にしか使えないのですか?
    可能性があります.
    #zipcode.py
    
    ZIPCODE_LIST = [
    	# some zipcodes that is mountain, island, jeju, and so on...
    ] 
    zipcodeリストのみのファイルを宣言します.
    from zipcode import ZIPCODE_LIST
    
    
    def check_address_by_zipcode(request, zipcode):
        if zipcode in ZIPCODE_LIST:
            # some logics that check argument zipcode is in the ZIPCODE_LIST 
    これを関数ロジックから読み込めばいいです.
    さらに言えば、
    実際、1300個のデータを検索したとき、O(n)O(n)O(n)とO(logn)O(logn)O(logn)は演技に大きな違いはないと思います.
    ただし、多くのリクエストがある可能性があるため、すべての面で最適化する必要があります.
    そこで、ZIPCODE_LISTでバイナリsearchを使って検索することにしましたzipcode、もちろん直接実現することもできますが、Pythonは何でもあります.モジュール名bisectbisect
    Pythonのバイナリプローブモジュール、bisect_left()bisect_right()bisect()・などがあります.bisect_left(arr, x)ソートされたリストarrにxを挿入したときに入るインデックスを左数から返す.
    したがって、上記のzipcode確認関数は、次のように変更できます.
    from zipcode import ZIPCODE_LIST
    from bisect import bisect_left
    
    
    def check_address_by_zipcode(request, zipcode):
        idx = bisect_left(ZIPCODE_LIST, zipcode)
    
        return True if ZIPCODE_LIST[idx] == zipcode else False
    zipcodeZIPCODE_LISTに含まれる場合、bisect_left()の結果により戻されるidxローストテーブルに近い値はzipcode(図書山間dbの郵便番号は0で始まるので整数処理も問題ありません)
    TIL
  • pythonバイナリ探索対応モジュールありbisect