[tony9402] Python Code For Test


ソース:https://github.com/VSFe/Algorithm_Study/blob/main/Concept/New/00_Special/Pythonic_Code_For_Coding_Test.md
Pythonは他のC-Style言語(C、C++、JAVA、...)いろいろな特殊な文法があります.
ただ、コードをテストするためにPythonを使ったり、基本的な文法だけを勉強して使う人は、Python特有の文法(Pythonicのコード)をうまく利用できないことが多い.
この資料は以下の人に推薦します.
  • Python構文は知っていますが、Pythonコードの作成に困っている人
  • C-Style言語Pythonを使用してエンコードテストを行うユーザー
  • 1. Unpacking
    a, b = map(int, input().split())
    
    これはiterableです(すべての重複可能なオブジェクトをiterableと呼びます.リスト、チュートリアル、文字列など...)1つのデータはすべて可能な文法です.
    しかし、このような状況もある.
  • から入力したリストから最初の値と最後の値
  • を得たいだけです.
  • 入力のリストから最初の値と最後の値を除外したいのですが、
  • _list = [1, 2, 3, 4, 5]
    first_index, *rest, last_index = _list
    print(rest) # 2 3 4
    
    Pythonは*(アスタリスク)を以下の場合に使用します.
  • 乗数、繰返し二乗
  • List型容器を繰り返し、
  • を拡張する
  • 可変因子
  • Unpacking
  • restに使用されるのは可変パラメータです.すなわち,パラメータの個数がどれくらいであるかが不明な場合に用いる.first indexおよびlast indexが前および後に移動する場合、restは前に移動します.
    Unpackingって何ですか?
    _list = [1, 2, 3, 4, 5]
    for num in _list:
        print(num, end = ' ') # 1 2 3 4 5
    
    Listの要素が出力する通常のコード.では、これはいかがですか.
    _list = [1, 2, 3, 4, 5]
    print(*_list) # 1 2 3 4 5
    
    これをListUnpackingと呼びます.
    事実リストだけでなく,容器型構造にも応用できる.tupleでもsetでもいいですUnpackingと言った以上、他のことを話しましょう.これはどうですか.
    a, b, c = [1, 2, 3]
    d = a, b, c
    print(d) # (1, 2, 3)
    
    このように1つの変数に複数の値を割り当てると、tupleにバインドされます.上ではtufloUnpackingができると言っていますが、これをPackingと考えればいいです.
    2. List Comprehension
    Pythonの花の一つとして、韓国語もスマートリストと呼ばれています.
    まず基本型を見て、
    _list = [i for i in range(10)] # 0 1 2 3 4 5 6 7 8 9
    
    このような構造です
    では、これはいかがですか.百駿オンラインローエンド1920号「捜狐」(http://boj.kr/1920)
    import sys
    input = sys.stdin.readline
    
    _ = input()
    _set = set(map(int, input().split()))
    q = input()
    _list = list(map(int, input().split()))
    
    print(*[1 if dt in _set else 0 for dt in _list], sep='\n')
    
    square = [[x ** 2 for x in range(3)] for _ in range(3)]
    print(square) # [[1, 4, 9], [1, 4, 9], [1, 4, 9]]
    
    コード長を短くする利点がありますが、長すぎると可読性が損なわれます.
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    print([[x for x in row if x % 3 == 0] for row in matrix if sum(row) >= 10]) # [[6], [9]]
    
    その他の例
    _list = [i for i in range(10)] # 1 ~ 10을 담는 리스트
    
    _list = [2 * i for i in range(10)] # 2, 4, 6, ..., 20을 담는 리스트
    
    tmp = [random.randrange(1,, 200) for i in range(100)]
    _list = [i for i in tmp if i % 3 == 0] # 주어진 리스트를 받아 3의 배수만 담는 리스트
    
    list_of_tuple = [(i, j) for i in range(100), for j in range(100, 0, -1)]
    _list = [(j, i) for i, j in list_of_tuple] # 값이 두개 들어있는 튜플을 받아 리스트를 생성하되, 튜플 내부의 값을 뒤집어서 저장
    
    _list = [i if i <= 15 else 15 for i in tmp] # 주어진 리스트를 그대로 담되, 15가 넘어가는 값은 15로 바꿔서 저장
    
    x = [i for i in range(5)]
    y = [i for i in range(5)]
    _list = [(i, j) for i in x, for j in y]
    
    3.ディクショナリが上手
    DictionaryおよびSetは、Hash Table構造を有する.したがって,挿入,削除,ブラウズ演算の時間的複雑度はO(1)である.
    初心者がよく犯す間違いはlistでinを使って値を探すことです.
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    for i in range(100):
        if i in data:
            print(1)
    
    この場合setを使うべきです.
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    _data_set = set(data)
    
    for i in range(100):
        if i in _data_set:
            print(1)
    
    数百万個のデータのセットで約10万回のin演算を実行し、1秒もかからないうちに完了し、listを使用すると数時間以上かかる可能性があります.
    setの構造上、同じ値は指定できません.
    i_want_to_erase_duplicate_element = [21, 31, 65, 21, 58, 94, 13, 31, 58]
    completed_list = list(set(i_want_to_erase_duplicate_element)) # 21, 31, 65, 58, 94, 13
    
    test_list = ['Test', 'test', 'TEST', 'tteesstt']
    converted_list = list(set(map(lambda string: string.lower(), test_list))) # test, tteesstt
    
    辞書はキーとペアで構成されています.
    fruit = ['apple', 'grape', 'orange', 'banana']
    price = [3200, 15200, 9800, 5000]
    _dict = {}
    
    for i in range(len(price)):
        _dict.append((fruit[i], price[i])) # {'apple' : 3200, 'grape' : 15200, 'orange' : 9000, 'banana' : 5000}
    
    そうやって作ったのですか?ここではzipです.zipは、各iterableの要素を収集するためのウィジェットを作成します.つまり、リストを作ってください.zipは辞書を作成するときにも役立ちます.
    fruit = ['apple', 'grape', 'orange', 'banana']
    price = [3200, 15200, 9800, 5000]
    
    _dict = dict(zip(fruit, price)) # {'apple' : 3200, 'grape' : 15200, 'orange' : 9000, 'banana' : 5000}
    
    一般的に、ディクシャナではない値を探したいと思っていると間違います.
    fruit = ['apple', 'grape', 'orange', 'banana']
    price = [3200, 15200, 9800, 5000]
    _dict = dict(zip(fruit, price)) 
    
    print(_dict['strawberry']) # Error!
    
    これを回避するためにinオプションを使うのは初心者です.
    fruit = ['apple', 'grape', 'orange', 'banana']
    price = [3200, 15200, 9800, 5000]
    _dict = dict(zip(fruit, price)) 
    
    print(_dict.setdefault('strawberry', 0)) # 0
    
    setdefaultはdickshernerに値がある場合にその値を返し、値がない場合に2番目のパラメータに渡される値を追加し、追加した値を返します.
    参考として,この方法を用いた類似辞書がある.これをdefaultdictと呼びます.
    from collections import defaultdict
    
    movie_review = [('Train to Busan', 4), ('Clementine', 5), ('Parasite', 4.5), ('Train to Busan', 4.2), ('Train to Busan', 4.5), ('Clementine', 5)]
    
    index = defaultdict(list)
    
    for review in movie_review:
        index[review[0]].append(review[1]) # {'Train to Busan': [4, 4.2, 4.5], 'Clementine': [5, 5], 'Parasite': [4.5]}