카테고리 없음

파이썬 시퀀스(sequence) 활용성 좋은 리스트, 1:1 매칭 꺼내쓰기 좋은 딕셔너리, 불변의 튜플

에스도비91 2022. 8. 18. 19:37
반응형

파이썬 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는 활용하기 좋은 함수일 듯 하네요.