[キャンプAI技術の誘導]U-stage1-3


📌 Life is short, you need python


📄 Python data structure


✏️ Stack


LIFO構造で、データの入力はpush、出力はpopです.Pythonではlistで実現できます.
>>> a = [1,2,3,4,5]
>>> a.append(10) # push
>>> a.append(20) # push
>>> a.pop() # pop
20
>>> a.pop() # pop
10 

✏️ Queue


FIFO構造で、データの入力はenqueue、出力はdequeueです.Pythonではlistで実現できます.しかし、collections.dequeを用いて実施することは有効である.
>>> a = [1,2,3,4,5]
>>> a.append(10) # enqueue
>>> a.append(20) # enqueue
>>> a.pop(0) # dequeue
1
>>> a.pop(0) # dequeue
2
>>>

✏️ Tuple


プログラムの実行中に変更できないデータが発生したり、予期せぬユーザーエラーが発生したりすることを防止するための変更できない値のリストです.値の変更に加えて、tupleはリスト内の演算、インデックス、スライドなどを使用することもできます.
>>> t=(1,2,3)
>>> t[1]
2
>>> t[0:2]
(1,2)
>>> t[1]=5 # Error 
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
1つの要素を持つtupleを宣言する場合は、,を加えて宣言します.
>>> t=(1) # 일반정수로 인식
1
>>> t=(1,) # Tuple
(1,)

✏️ Set


値は無順序に格納でき、数学では様々な集合演算が重複しないデータ形式で使用される.
>>> s = set([1,2,3,1,2,3]) # set 함수를 사용 1,2,3을 집합 객체 생성 , a = {1,2,3,4,5} 도 가능
>>> s
{1, 2, 3}
>>> s.add(1) # 한 원소 1만 추가, 추가, 중복불허로 추가 되지 않음
>>> s
{1, 2, 3}
>>> s.remove(1) # 1 삭제
>>> s
{2, 3}
>>> s.update([1,4,5,6,7]) # [1,4,5,6,7] 추가
>>> s
{1, 2, 3, 4, 5, 6, 7}
>>> s.discard(3) # 3 삭제
>>> s
{1, 2, 4, 5, 6, 7}
>>> s.clear() # 모든 원소 삭제
>>> s1 = set([1,2,3,4,5])
>>> s2 = set([3,4,5,6,7])
>>> s1.union(s2) # s1 과 s2의 합집합
{1, 2, 3, 4, 5, 6, 7}
>>> s1 | s2 # set([1, 2, 3, 4, 5, 6, 7])
{1, 2, 3, 4, 5, 6, 7}
>>> s1.intersection(s2) # s1 과 s2의 교집합
{3, 4, 5}
>>> s1 & s2 # set([3, 4, 5])
{3, 4, 5}
>>> s1.difference(s2) # s1 과 s2의 차집합
{1, 2}
>>> s1 - s2 # set([1, 2])
{1, 2}

✏️ Dict


データを格納する際に区別できるキーと対応する値のデータ構造.Hash Tableという用語は他の言語で使われています.
>>> country_code = {} # Dict 생성, country_code = dict() 도 가능
>>> country_code = {"America": 1, "Korea": 82, "China": 86, "Japan": 81}
>>> country_code
{'America': 1, 'China': 86, 'Korea': 82, 'Japan': 81}
>>> country_code.items() # Dict 데이터 출력
Dict_items([('America', 1), ('China', 86), ('Korea', 82), ('Japan', 81)])
>>> country_code.keys() # Dict 키 값만 출력
Dict_keys(["America", "China", "Korea", "Japan"])
>>> country_code["German"]= 49 # Dict 추가
>>> country_code
{'America': 1, 'German': 49, 'China': 86, 'Korea': 82, 'Japan': 81}
>>> country_code.values() # Dict Value만 출력
dict_values([1, 49, 86, 82, 81])

✏️ collections.deque


Deque(Double ended queue)は、データを双方向に処理できるキュー型データ構造である.次の図はdequeの構造を示しています.

stackとqueueをサポートするモジュールはlistよりも効率的なストレージ方式をサポートします.また、すべての既存list関数をサポートし、rotateなどのチェーンテーブル特性をサポートします.
関数機能append(x)最後にx挿入appendleft(x)前にx挿入extend(iterable)最後にiterableオブジェクト接続extendleft(iterable)前にiterableオブジェクト接続pop()最後の要素削除popleft()前要素削除rotate(n)n

✏️ collections.OrderedDict


既存のdictモジュールでは入力の順序は保証されず、入力の順序のみが保証され、Pythonの3.6バージョンから入力の順序出力が保証されます.

✏️ collections.defaultdict


既存のdictは、キー値が決定されていない場合にKeyErrorを生成し、キー値が決定されていない場合にKeyErrorを阻止するためにdefault値を設定することができる.
from collections import defaultdict
d=defaultdict(lambda : 0) # default 값을 0으로 설정. 
print(d['first']) # 0
print(d['아무거나']) # 0

✏️ collections.Counter


Sequence type、dicttype、キーワードparameterなどのデータ要素の数をdict形式で返します.また、Setのいくつかの演算もサポートされています.
c=Counter(a=4,b=2,c=3,d=-2)
d=Counter(a=1,b=2,c=3,d=4)

# 같은 연산이지만 다른 결과 
print(f'c-d :{c-d}') #  음수값,0은 무시한다
c.subtract(d) # 음수값도 저장한다
print(f'c.subtract(d) : {c}')
Counter({'o': 2, 'B': 1, 's': 1, 't': 1, 'c': 1, 'a': 1, 'm': 1, 'p': 1})
Counter({'Boost': 1, 'camp': 1})
Counter({'Boost': 1, 'camp': 1})
c=Counter(a=4,b=2,c=-3,d=-2)
d=Counter(a=1,b=2,c=-5,d=2)
print(f'c | d :{c | d}') #  음수값,0 은 무시한다
print(f'c + d :{c + d}') #  음수값,0은 무시한다
print(f'c & d :{c & d}') #  음수값,0은 무시한다
c-d :Counter({'a': 3})
c.subtract(d) : Counter({'a': 3, 'b': 0, 'c': 0, 'd': -6})
c | d :Counter({'a': 4, 'b': 2, 'd': 2})
c + d :Counter({'a': 5, 'b': 4})
c & d :Counter({'b': 2, 'a': 1})

✏️ collections.namedtuple


データ構造体をtuple形式で格納し、データを格納する変数を予め指定することをサポートします.
from collections import namedtuple
Point=namedtuple('Point',['x','y'])
p=Point(11,22) # (x=11, y=22)
print(f'x={p[0]} , y={p[1]}') # x=11,y=22

📄 Pythonic code


Python特有の文法を利用して、効率的にコードを表現する方法です.

✏️ Split & Join


split():リスト->文字列
colors=['red','blue','green']
result=''
for s in color:
    result+=s
    
print(result) #redbluegreen

###############################
colors=['red','blue','green']
result=''.join(colors)
print(result) #redbluegreen
join():文字列->リスト
colors='red blue green'
print(colors.split()) # ['red','blue','green']

example = 'python,java,javascript' # 
print(example.split(",")) # ","을 기준으로 문자열 나누기,['python','java','javascript']

✏️ List comprehension


Pythonで最もよく使われる方法の一つで、for+appendよりも速度が速い.
>>> case_1 = ["A","B","C"]
>>> case_2 = ["D","E","A"]
['AD', 'AE', 'AA', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']
>>> result = [i+j for i in case_1 for j in case_2]
>>> result
['AD', 'AE', 'AA', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']
>>> result = [ [i+j for i in case_1] for j in case_2] # 2차원
"""
for j in case_2 : 
    for i in case_1:
""" 
>>> result
[['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AA', 'BA', 'CA']]

✏️ Enumerate & Zip


列挙():リスト、dict、set、str、bytes、tuple、rangeを表すIterableオブジェクトの要素を抽出する場合は、インデックスを貼り付けて抽出します.
>>> for index,element in enumerate(['a','b','c']):
    	print(i,v)
    
0 a
1 b
2 c
zip():同じ長さのiterableオブジェクトの値を並列に抽出
>>> for a,b,c in zip([1,2,3],[4,5,6],[7,8,9]):
    	print(a,b,c)
1 4 7
2 5 8
3 6 9
    

✏️ Lambda & Map & Reduce


Lambda:関数名がなく、関数のように使用できる匿名関数です.python 3から使用することはお勧めしませんが、多く使用されています.
>>> f=lambda x,y : x+y
>>> f(1,4) 
5
map():入力したデータ型の各要素を関数によって実行した結果を組み合わせてmap反復器オブジェクトを返します.通常、iteratorオブジェクトは、不活性計算(不活性演算)時にのみデータを取得し、メモリを大幅に節約する.
>> data=[1,2,3]
>> result=map(lambda x:x**2,data)
>> next(result) # 1
1
>> next(result) # 4
4
>> next(result) # 9
9
>> next(result) # StopIteration
reduce():mapとは異なり、ターゲットに関数を積算することでマージの結果を返します.
>> from functools import reduce
>> reduce(lambda x,y : x+y ,[1,2,3,4,5]) # 15
15

✏️ Iterator

iter()メソッドを使用してIteratorオブジェクトをIteratorオブジェクトとして作成し、next() メソッドで順次呼び出し、最後のデータの後にnext()を呼び出すとStopIteration Errorが生成されます.たとえば、クエリーの場合、Pythonはlistを反復器として一時的に使用します.
>>> iterable='iterable'
>>> iterator=iter(iterable)
>>> next(iterator) # i
i
>>> next(iterator) # t
t
>>> next(iterator) # e
e
>>> next(iterator) # r
r
>>> next(iterator) # a
a
>>> next(iterator) # b
b
>>> next(iterator) # l
l
>>> next(iterator) # e
e
>>> next(iterator) # StopIteration Error

✏️ Generator

yieldによってiteratorが生成され、要素の使用時にメモリが返されます.したがって、ビッグデータの処理中に使用したり、ループを中断したりする可能性がある場合に使用すると、多くのメリットが得られます.さらに、list comprehensionと同様の形態がジェネレータに存在することを理解する.違いは、[]の代わりに()を使用することである.
>>> def general_list(value):
        result = []
        for i in range(value):
            result.append(i)
        return result
    
##########################
>>> def generator_list(value):
        result = []
        for i in range(value):
            yield i


>>> for i in generator_list(4):
    	print(i) 
0
1
2
3

##########################
>>> generator=(i for i in range(4))
>>> for i in generator_list(4):
    	print(i) 
0
1
2
3
    

✏️ Asterisk


Pythonでは、*にはさまざまな用途があります.
  • 乗算
  •     mul=2*2
  • 平方演算
  •     square=2**2
  • Variable Argument
  • >>> def asterisk_args(a,b,*args):
    	print(a,b,args)
    >>> asterisk_args(1,2,3,4,5)
    1,2,(3,4,5)
    
    >>> def asterisk_args2(*args,a,b):
    	print(args,a,b)
    
    >>> asterisk_args2(1,2,3,4,5,6) # Type Error , 가변인자는 맨 마지막 parameter, 오직 한개만 사용가능
  • Keyword variable Argument
  • >>> def asterisk_kwargs(a,b,*args,**kwargs): # Variable argument 와 Keyword variable argument 혼용가능.
        	print(a,b,args)
            print(kwargs)
            
    >>> asterisk_kwargs(1,2,3,4,5,first=6,second=4)
    1 2 (3, 4, 5)
    {'first': 6, 'second': 4}
    
  • Unpacking
  • Iterableオブジェクトの値を開きます.
    >>> data = ([1, 2], [3, 4], [5, 6])
    >>> print(*data)
    [1,2],[3,4],[5,6]
    
    >>> for data in zip(*([1, 2], [3, 4], [5, 6])):
    	print(data)
    (1,3,5)
    (2,4,6)
    
    >>> def asterisk_test(b, c, d,):
    	print(b, c, d)
    >>> data = {"b":1 , "c":2, "d":3}
    >>> asterisk_test(**data)
    1 2 3

    📚Reference


    Deque(Double ended queue)