파이썬 리스트 list 완전 이해를 위한 전체 정리 요약

이 문서는 파이썬 list 의 전반적인 이해에 관하여 다룹니다. 전체적인 내용을 한눈에 파악할 수 있도록 요약하여 정리하였고, 각 목차에 따른 자세한 내용은 개별 문서로 따로 작성하여 링크를 걸겠습니다. 내용과 관련하여 궁금한점 있는 댓글로 질문하시면 해당 내용을 답변하는 문서가 업데이트 됩니다.



파이썬 리스트 – python list

파이썬 리스트는 데이터를 모아서 저장하는데 쓰인다. 리스트는 1차원 배열이다. 어렵게 들릴 수가 있는데 1차원 배열이란 간단하게 여러개의 데이터를 한줄로 모아두고 그것에 인덱스를 붙인것이다. 예를 들어 내가 매일 줄넘기를 했고 줄넘기 횟수를 매일 기록해두었다고 하자. 이를 파이썬에서 리스트로 작성하면

1일차 2일차 3일차 4일차 5일차 6일차 7일차
100개 200개 150개 250개 200개 100개 300개

리스트로 작성하면 아래와 같다.

jumpRope = [100, 200, 150, 250, 200, 100, 300]

1차원 배열이란게 다른게 어려운게 아니라 이런 뜻이다. 리스트는 파이썬에서 정말 많이 사용되기 때문에 기초를 확실히하여 잘 쓸 줄 알아야 파이썬을 더욱 잘 활용할 수 있게 된다. 파이썬 리스트를 생성하고 내용을 넣고 빼고 수정하는 것은 간단하지만 리스트를 정말 잘 이해할수록 응용범위가 커진다. 따라서 파이썬 입문자는 다른 어떤 파트보다 공부를 꼼꼼히 해둘 필요가 있다.

데이터 저장

위에서 본것처럼 1차원 배열은 값과 인덱스로 이루어져 있다. 값은 100개 200개 150개… 이 부분을 값이라고 한다면 인덱스는 그 값의 순서이다.

jumpRope 의 첫번째 값을 확인하고 싶다면 jumpRope[0] 이라고 치면 된다. 첫번째 값인데 왜 jumpRope[1] 이 아니고 jumpRope[0] 이라고 질문할 수 있겠다. 쉽게 말하자면 사람은 숫자를 셀 때 하나 둘 셋 넷… 이라고 1이라는 숫자를 먼저 말한다. 그런데 컴퓨터는 0, 1, 2, 3… 이라고 0이라는 숫자를 먼저 말한다. 왜 그렇게 만들었는지 궁금하겠지만 실익이 없는 호기심을 충족시키는데 시간을 쏟게할 수 없다. 그저 이러한 관례를 만든 제작자를 탓할 수 밖에… 아무튼 리스트에서 첫번째 인덱스는 0 으로 표시한다.

 

파이썬 리스트 list

빈 리스트

tempList = [] #빈 리스트 생성
tempList = list() #빈 리스트 생성 결과는 위와 완전히 동일하다

참고로 빈 리스트에 인덱스로 접근하면 에러가 발생한다.

빈 리스트 인덱스

저장할 수 있는 타입

리스트에 저장할 수 있는 타입은 제한이 없다. 어떤 타입이든 어떤 객체든 넣을 수 있다.

리스트 안에 넣을 수 있는 것들

리스트 안에 정수, 리스트 안에 문자열, 리스트 안에 , 리스트 안에 튜플을 넣은 형태이다. 뿐만 아니라 class 로 생성한 객체를 넣을 수도 있다. 만약 현재 객체라는 개념에 대해서는 모른다면 나중에 배우기로 하고 넘어가도 된다. 아무튼 리스트 안에는 뭐든 다 넣을 수 있고 항목별로 그 종류가 달라고 상관없다.

데이터 수정 (가변, mutable)

리스트를 작성하는데 실수를 했거나, 혹은 다른 어떠한 이유로 리스트를 수정할 필요가 생겼을 때 튜플과 달리 리스트는 수정을 허용한다.
우리집 가족 이름을 적은 리스트를 작성하였다고 가정하자. 그런데 셋째자식 이름이 ‘삼식이’ 인거 작성자가 실수로 ‘셋식이’ 라고 적었다면 이를 수정해야 한다. 수정하는 방법은 인덱스로 접근해서 수정할 수 있다.

family = ['엄마', '아빠','일식이', '이식이', '셋식이']    #리스트 선언
family[4] = '삼식이'    #리스트 수정
print(family)    #확인

파이썬 리스트 수정

이렇게 리스트 내용을 변경할 수 있는 것을 뮤터블(mutable)이라는 유식한 용어가 있으니 지적인척 하는 것을 좋아하는 사람은 알아두면 좋다. 반대로 튜플(tuple)의 경우는 내용을 수정할 수 없다. (대신 데이터 처리속도가 리스트보다 빠르다) 수정할 수 없는 것을 임뮤터블(immutable) 이라고 한다.

리스트 연산

tempList = [1,3,5,7,9]  #리스트 선언
len(tempList)   # tempList 의 항목 수 리턴
max(tempList)   # 가장 큰 수 리턴
min(tempList)   # 가장 작은 수 리턴
sum(tempList)   # 합계
sorted(tempList)   # 리스트 내용 오름차순 정렬

리스트 연산

list1 = ['가', '나', '다']   # 첫번째 리스트 선언
list2 = ['라', '마', '바']   # 두번째 리스트 선언
list3 = list1 + list2   # 첫번째 두번째 리스트 합치기
print(list3)  # 합친 결과

파이썬 리스트 연산

in 리스트

리스트 안에 어떠한 항목이 있는지 없는지 확인할 수 있다. 확인할 항목 in 리스트명을 하면 해당 항목이 리스트 안에 있으면 True 없으면 False 를 반환한다.

family = ['엄마', '아빠','일식이', '이식이', '삼식이']
'삼식이' in family  # True 반환
'셋식이' in family  # False 반환

리스트 in
in 은 리스트 안의 하나의 원소만을 체크할 수 있다. 예를 들어 [‘삼식이’, ‘엄마] in family 는 작동하지 않는다. 여러개의 원소가 있는지 확인하는 방법은 따로 개별글로 업데이트 하도록 하겠다.

리스트 슬라이싱

슬라이스라고 하는 것은 리스트의 원하는 부분만을 골라내는 것을 말한다. 리스트명[숫자:숫자] 의 형태를 띈다. 일단 직접 보자 그래야 이해가 빠르다.

파이썬 리스트 슬라이싱

family[0:2] 이면 0~1까지의 인덱스 번호를 출력하라는 의미이다. 잘 확인해야 한다. familly[0:2] 에서 [0:2] 의 의미는 0 <= 정수 < 2 를 의미한다 0보다 크거나 같고 2보다는 작은 정수를 의미한다. (=숫자 2는 해당하지 않는다)

family = ['엄마', '아빠','일식이', '이식이', '삼식이']

#숫자 자리를 비워두면 리스트의 처음(앞을 비웠을 경우) 또는 끝(뒤를 비울 경우)을 의미한다.
family[2:]   # 인덱스 2부터 리스트 끝까지 의미
family[:4]   # 인덱스 처음부터 인덱스 3까지(4는 포함안함) 의미

에일리어스 (alias)

에일리어스라는 것은 파이썬에서 두 변수의 메모리 주소가 같은 것을 말한다. 메모리라고 하니 어렵게 느껴질 수 있다. 쉽게 말하자면 어느 리스트에서 어느 한 값을 수정했는데 수정하지 않은 다른 리스트가 수정되어버리는 경우가 있다. 이 경우 동일한 메모리 주소의 값을 변경해서 생기는 문제이다. 여기서는 가볍게만 소개하고 자세한 내용은 차후 개별 글로 다시 업데이트하겠다.

family = ['엄마', '아빠','일식이', '이식이', '삼식이']
famfamfam = family
family[4] = '호식이'
print(family)
print(famfamfam)

family 를 수정하면 famfamfam 도 바뀐다. famfamfam 이 family 를 가리키기 때문이다.


리스트 family 만 수정하였는데 리스트 famfamfam 가 함께 수정된 것을 볼 수 있다. 한편 값이 같다고 해서 항상 메모리주소가 같은 것은 아님을 유의하자.

 

리스트 메서드

family = ['엄마', '아빠','일식이', '이식이', '삼식이',]
family.append('사식이') # 리스트 맨 뒤에 '사식이' 추가
family.clear() # 리스트를 빈 리스트로 만들기
family.count('이식이') #리스트 안에 '이식이' 라는 원소(=항목)가 몇개 있는지 카운트

family2 = ['갑순이', '을순이']
family.extend(family2) # family 뒤에 family2 의 원소들만 추가 (리스트 안에 리스트를 추가하는 것이 아님을 유의)
family.index('일식이') # '일식이'의 인덱스 확인
family.index('일식이', 0, 2)  
# family[0:2] 중에서 '일식이'의 위치 확인. 없으면 ValueError 에러 발생

family.insert(2, '영식이')  # 인덱스 2 위치에 '영식이' 추가
family.pop(3)  # 인덱스 3의 원소를 제거하면서 제거한 원소 리턴
family.pop() # 괄호안에 값을 비워둔 경우 리스트 맨 뒤의 원소를 제거, 제거한 원소 리턴
family.remove('사식이')  # 리스트안에 '사식이' 제거, 사식이 없으면 ValueError 에러 발생
family.reverse()   # 리스트 정렬 순서를 반대로 뒤집기,
family.sort()    # 리스트 항목을 오름차순으로 정렬
family.sort(reverse=True)   # 리스트 항목을 내림차순으로 정렬

중첩 리스트

리스트 안에 리스트 넣을 수도 있다. 이 경우에도 당연히 인덱스로 리스트 안에 리스트 그 안에 있는 항목에 접근하거나 슬라이싱 할 수 있다.

family = [['엄마', '아빠','일식이', '이식이', '삼식이'],['할머니','할아버지']]
family[0][2:4]
family[1][0]

 

 

Leave a Comment