[pgs KakaoTuple]正規表現とdictionaryの「in」


プログラマータルト2019ココア実習生コードテスト

re.findall


reは、strタイプのデータを処理するためのRegular Expressionの略です.NLPモデルをデータプリプロセッシングする場合、re.sub(文字を検索して置換)、re.match(位置検索)などが役立ちます.
re.findallは一致する部分を見つけて抽出します.一番上のようにstrを入力するときは、かっことカンマで区切るようにします.そして,分割した文字には,数字部分のみを抽出して一つの要素にするためにfindallを用いた.[0-9]は数字を表し、+は前に1つ以上の数字がある部分を検索することを表す.たとえば、2番目の「{2,1」では、2と1が一致し、それぞれパラメータとしてリスト形式に入ります.bs 4スクロールを行うと、find allも対応するすべてのタグを検索し、リスト形式になります.これと似ています.

辞書とlistのin


下図に示すように、リストがデータに含まれているか否かを判断すると、リストはO(n)、dictおよびsetはO(1)となる.dictとsetは重複を許さないので、(unique)と要素はそれぞれ自分の位置を占めているので、直接見つけることができます.
if a in data_structure:
	print(a)
逆にlist,tupleとは異なりelementを直接変更することはできない.List[i]=3などのコマンドは使用できません.

不便な点もありますが、in機能の実行にはO(1)が必要です.forまたはwhile loopでinをチェックする必要がある場合は、それを使用する必要があります.
次のテストでは、5つの数字を含む1~1000個の数字10005を生成した後、listとdictでtain関数の駆動時間を確認します.経過時間の桁数の違いからdictの速度は約10倍であることがわかる.


Question




Solution


PSEUDO
受信
  • str、例えば[2],[2,1],[2,1,3],[2,1,3,4]はlist[int]形式で
  • を作成する.
  • は短い順序で並べ替えられ、key=len
  • ans=dict()(辞書用)
  • for set in list:
    if num not in ans:ans[num]=True(ansに追加されたキーの1つ)
    else: pass
  • 出力
  • のみ戻りリスト(ans.keys()キー
  • import re
    def solution(s):
        split_list = s.split('},')
        lists = list()
        lists.append(re.findall('[0-9]+', split_list[0]))
        lists.append(re.findall('[0-9]+', split_list[-1]))
        for str_ in split_list[1:-1]:
            lists.append(re.findall('[0-9]+', str_))
        
        sort = sorted(lists, key=lambda x: len(x))
        ans = dict()
        for set1 in sort:
            for num in set1:
                if num in ans:
                    continue 
                ans[int(num)] = True
        return list(ans.keys())
    github