파이썬 3번째 포스팅은 sequence입니다.
sequence에는 3종류가 있는데
[] 리스트_list, {} 딕셔너리_dictionary, () 튜플_tuple
dictionary는 스펠링이 너무 기니 보통 축약형으로
dict라 합니다. 이번 포스팅의 주된 내용
리스트[List]
list는 다음에 포스팅할 loop과 list comprehension
에서 더 자세히 다룰꺼고 기본은 구글링만 해봐도 익힐 수
있으니 skip, 대학교 때 교양 과목(공학컴퓨터프로그래밍)
으로 코딩을 배울 때, 인상깊었던 말이 있는데
a=['a', ['b',2,(1,4,5,6,7),3], 3] ; print(a[1][2][2:4])
위의 예와 같이 양파껍질처럼 층층이 리스트 안에 리스트
뿐 아니라 다른 시퀀스들도 계속 넣을 수가 있어서 그
depth를 잘 파악하고 활용하는 것이 중요하다 했습니다.
그리고 slicing(:) 을 잘 쓰는 것도 중요하죠.
cf. 이건 시퀀스 뿐 아니라 string type에서도 사용 가능해서
엑셀처럼 left, right, mid를 쓸 필요 없으니 아주 편합니다.
python에서의 index는 0부터 시작하고
슬라이싱 뒤쪽 숫자의 -1까지 출력한다는 점 주의!!
튜플(Tuple)
Tuple은 실제로 거의 쓸 일이 없었고 코딩할 때
정신만 똑바로 차리면 list로 완전 대체가 가능하니
이 또한 간단하게 짚고 넘어가자면
위의 예시처럼 2번째 항목을 변환해주려 할 때
오류가 뜨는 것을 볼 수 있듯이 튜플은 코딩하는데 있어
함부로 요소 값을 변환하지 못하게, 즉 데이터가 오염
되지 않도록 불변으로 고정시켜 주는 sequence 입니다.
딕셔너리{dictionary}
드디어 dictionary, 사실상 이것을 위한 포스팅입니다.
처음 코딩을 책으로 배우고 실전에 적용할 땐
리스트만 자주 썼지 딕셔너리는 딱히 쓸 곳이 없어서
개념이 흔들릴 때가 많았는데 핵심만 먼저 언급하자면
사전처럼 데이터를 키워드와 1:1 대응시켜
모아두고 몇 번째 넣어놨는지는 모르지만
키워드만으로 그 값을 소환해 낼 때
dict를 언제 쓸 수 있는지 위 개념만 잘 잡아두면
필요할 때 생각이 날꺼고 활용은 그때그때 구글링
해가며 쓰시면 됩니다. 기본만 좀 보자면
item=['a1','a2','a3','a4','a5']
num=list(range(0,10,2)) ; print(num)
mkdict=dict(zip(num,item)) ; print(mkdict)
print(list(mkdict.keys())[1])
print(list(mkdict.values())[2])
mkdict["b"]=7 ; print(mkdict) # key가 없으면 추가, 있으면 수정됨
자주 쓰는 것들만 적어봤습니다.
리스트 2개를 매칭해 딕셔너리로 생성하는 zip
딕셔너리 활용을 위한 keys(), values() 그리고
거기에 slicing [#]을 붙여두었죠. 구조 파악을 잘
해보시기 바랍니다. 위의 결과는 아래와 같습니다.
실전) 아래는 코딩의 일부라 저것만 쓴다고
돌아가진 않지만 활용의 예로 보자면
eqp=open("SEM_address.txt","r") ; lines=eqp.readlines()
SEM_adrs=dict([line.split() for line in lines if line.startswith('M')]) ; eqp.close()
a1 b1 \n a2 b2 \n a3 b3 \n a4 b4 \n ~
2개의 항목으로 쭉~ 여러줄 나열된 텍스트 파일을
eqp이란 변수로 불러왔고 그 안에 여러 줄의 텍스트를
lines로 정의했습니다. lines를 for문으로 한 줄씩 꺼내온
line에 a*의 첫번째 문자가 'M'으로 시작하는 경우 a* b*
를 가운데 띄어쓰기로 split해서 a*를 key로 b*를 value
로서 dict를 만드는 코드입니다.
msr_dict=dict([i.split() for i in msr if len(i.split())==2]) ; stepID=msr_dict['/recipe_name'].split('_')[0]
wf_no='WF'+msr_dict['/wafer_id'].split('_')[1].replace('"','') ; n_shot=int(msr_dict['@no_of_chip'])
n_CD=int(msr_dict['~total_of_mp_name']) ; CD_list=[j[1] for j in [i.split() for i in msr] if j[0]=='~mp_name']
이건 msr 파일이라고 텍스트 파일 용량이 1MB가 넘는
엄청난 양의 내용 중에서 a* b* 2개의 항목만 있는 줄을
골라 dictionary로 만들고 그 중에서
'/recipe_name' '/wafer_id' 등의 키워드가 a 항목에
있는 라인들만 골라 b의 값으로 정의하는 코드입니다.
이런 식으로 대용량 텍스트에서 원하는 항목들만
dictionary로 규정해서 키워드로 값을 뽑아내는데도
쓸 수 있고 아직 배우고 있어 잘 모르지만 머신러닝처럼
사용자의 시도가 새로운 DB로 쌓여 연산을 하는 경우
에도 dictionary는 활용하기 좋은 함수일 듯 하네요.