2024. 10. 15. 18:11ㆍpython/을 처음부터
좋은 하루.
이번에는 복합자료형에 대해서 공부할 것이다.
다른 언어에서 '이거 있으면 좋겠다.' 하는 것들을 여긴 친절하게 다 구현해두고 우리에게 떠먹여준다.
그런데... 너무 친절해서 부담스러울 지경이다.
아무튼 배풀어주는데, 받아먹어야지. spread love it's the blooklyn way.
복합 자료형은
원시 자료형들, 혹은 다른 복합 자료형들을 조합한 데이터 구조이다.
int i와 int arr[]의 차이? int는 정수 하나만 저장할 수 있지만 int array는 여러개의 정수를 저장할 수 있다.
뭐라 설명하기가 어렵네. 아무튼 자료형들이 막 뭉쳐 모여 있으면 복합 자료형이라 생각하자.
예시로는 이전에 다룬 string도, 결과적으로는 char type의 배열을 사용한 복합자료형이다. 배열도 복합자료고... 아무튼.
앞으로 공부할 python의 복합 자료형은
list, tuple, dictionary, set 등이 있다.
하나씩 보다가 보면, 전부 다 어디선가 본 듯한 기시감이 느껴질 것이다. 그러면서도 그것들보다 고도화된 자료형임을 느낄 수 있게된다. '이거 되면 좋겠다', '이거 이렇게 되면 편할텐데' 같은 것들이 현현했다는 느낌이다.
우선 list = ["부터", "시작하자"]
list는 우리에게 마치 array같은 느낌으로 다가온다.
선언하는 모양새도, 할당하는 모양새도 비슷해보인다.
li = [1, 2, 3, 4]
int arr[] = {1, 2, 3, 4};
하지만 python은 두 발 앞서있다. 한 list에 여러 자료형을 사용할 수 있다.
미쳤다고 할 수 밖에 없다.
li = ["meow", 1, 2, 3.14 , "meow", "arigatou", ['a', 'n', 'i', 'm', 'e']]
이딴게 가능하다는 말이다!
내 기억에 c에서 이런 기능을 구현하려면 array와 structure를 이리저리 만져야했던 것 같다.
사용법을 알아보자. 사용법은 array와 크게 다르지 않다.
li[0]은 meow를, li[3]은 3.14를, li[6]은... ['a', 'n', 'i', 'm', 'e']에 접근한다. this must be illegal.
2차원 list도 array[][]와 비슷하다.
li = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
의 형태이다.
역시나 접근방법도 비슷하다
li[0][0] -> 1 // li[2][2] -> 9
그런데 상기한 냐, 이치, 니, 산, 냐, 아리가토 를 다시 보자. 여러 자료형이 혼재되어있다.
난데 없이 list가 하나 끼어있다. 여기서 "mini"를 꺼내보자.
li[6][3], li[6][2], li[6][1], li[6][2]
나는 혼재된 list에서 list 참조하기 는 pointer array를 생각하며 이해했다. 물론 그냥 피상적으로 보이는 대로 이해해도 별 차이는 없다.
만에 하나, 십만에 하나, int에 하나, long long의 하나의 설마하는 마음으로 드리는 말씀인데; 청컨데 li = [[[[[[[[[...]]]]]]]]]
같은... '영원회귀', '행복한 시지프', '힐베르트 호텔 예약하기' 같은 행위는 농담정도로만 마음 속에 두시길. li = [][][][][][][][][][][]...
list도 slicing이 있다!
달리 드릴 말씀은 없다. 전 글의 string 부분을 다시 보는 편이 더 좋을 것이다.
https://meowmoew.tistory.com/13
당연하면서도 조금 괴상하게 느껴지지만;
slice 범위에 list가 포함되어있다면, 해당하는 list와 그 요소들 모두 포함된다.
"meow"... 부터 시작해서 ...'a' 'n' 'i' 까지 만 slice하는 것은 안되는 것 같다.
지금 해보고 왔다. main list에서 시작해서 sub list의 특정요소까지만 slice하는 건 아무래도 불가능한 것 같다.
아무래도 sliced list를 또 slice 하는 수 밖에 없는 것 같다. 조금 아쉽다.
산술연산자...도 있다... +하고 *만.
두 list를 +로 이을 수 있다. a = [] + b = [] 👉 [a의 요소들과 b의 요소들 나열]
곱하기를 사용하면 반복출력된다. a = [1, 2]. a * 2 👉 [1, 2, 1, 2]
list를 다루는 함수들
휴. 나는 지금 현기증이 난다. 구역질이 치민다. list는 실존인가.
list를 수정하는 함수들
list에 요소를 넣고, 일고, 빼고, 바꾸고 해야 할 것이다.
- 요소를 추가하기 위해 append를 사용하자
용법은변수명.append.('추가할 요소'들을 args로)
li = [1, 2, 3, 4, 'a','b']
의 뒤에 'd'를 이어붙이기 위해 li.append('d')를 사용하겠다.
li는 이제 [1 ,2, 3, 4, 'a', 'b', 'd']의 형태가 된다.
당연히 다른 자료형도 가능하다.
- 당신은 a 뒤에 d를 끼워넣고싶다! insert를 사용하자.
insert의 용법은변수명.insert('index', '삽입할 요소'들을 args로)
li.insert(6, 'd')를 실행하면, d의 자리인 6번 index에 d가 새치기한다.
- 당신은 list의 요소들을 수정하고싶다.
아주 직관적이다. 재할당하듯, var_name[index] = new elmts
하면 된다.
li[3] = "meow"는 3번 indext에 있는 4를 "meow"로 대체할 것이다.
- 당신은 list 요소들을 삭제하고 싶다.
여기는 제법 여러가지 있다. 하나씩 보자.
del은 해당 index에 위치한 요소를 지운다. 용법은 del var_name[index]
del도 slicing을 사용할 수 있다. 큼직하게 싹둑해서 버려버리자.
remove는 args와 일치하는 첫 요소를 지운다. 용법은 var_name.remove(arg)
li = ["meow", 2, 3, "meow", 'a','b']
에 li.remove("meow")를 적용하면 첫째 meow만 사라진다.
pop은... 삭제라기 보단... 지시한 값을 반환하고 삭제한다. 용법은var_name.pop(index)
index를 기재하지 않는다면 deafault로 가장 뒤의 요소를 pop한다. stack같다.
- 기능성 함수들.
기능성 함수라니. 말이 웃기다. functional function이라니.
utillity function정도가 좋을 것 같다. 실제 명칭은 모르겠다. python은 아직 공식 문서를 안봤다.
- len(var_name)은 args로 받은 list의 길이를 반환한다.
- var_name.sort()는 해당 list를 오름차순으로 정렬해준다.
- var_name.sort(reverse=True)로써 내림차순 정렬을 할 수도 있다.
자료형이 혼재된 list는 sort를 적용할 수 없다. - var_name.reverse()는 해당 list를 그대로 뒤집어서 반환한다.
결코 sorting 함수가 아님에 주의하자. - var_name.index(args)는 args와 동일한 값을 찾아서 index를 반환한다.
- var_name.count(args)는 해당 list에 args와 일치하는 값의 갯수를 구해 반환한다.
- master_list.extend(sub_list) 혹은 master_list.extend( [elemt x, elemnt y] )는 args로 보낸 list의 요소들을 master list의 뒤에 연장한다. extended된 list가 별개의 list가 아님에 유의하자.
master = [1, 2].extend(sub = [3, 4]) 👉 master [1, 2, 3, 4]
dasvidaniya!
python의 다음 주제로는 tuple을 다루겠다.
왜냐면... jump to python의 순서를 따라가기 때문에...
휴. 다음번부턴 그냥 markdown으로 작성해야겠다. wysiwyg은 너무 불편해잉.
'python > 을 처음부터' 카테고리의 다른 글
python을 처음부터-1 (1) | 2024.10.14 |
---|