Python의 기본 - 콜렉션 타입 중 리스트 (4)

2026. 4. 27. 10:38AI/Python

Python의 콜렉션(Collection) 타입 중 리스트에 대해 공부하게 되었다.

 

그럼 콜렉션 타입이란 무엇일까? 그림으로 자세히 알아보자.

 

콜렉션 타입(Collection)

 

여러 개의 데이터 항목을 하나의 단위로 관리할 수 있게 해주는 데이터 구조이다.

 

여러 개의 데이터를 하나의 변수에 저장하고 관리할 수 있게 해주며, 종류는 다음과 같다.

 

 

이번 시간에 배울 리스트는 순서가 있는 컬렉션으로, 튜플과 함께 인덱싱이 되는 자료형이다.

 

리스트(List)

 

여러 개의 데이터를 하나의 변수에 순서대로 저장하는 대표적인 컬렉션 자료형으로

 

대괄호([])를 이용해 생성하며 각 요소는 인덱스를 통해 접근할 수 있고

 

각 요소에 서로 다른 자료형의 값을 함께 저장할 수 있고

 

요소의 수정, 추가, 삭제가 가능한 변경 가능한 구조를 가진다.

 

이로 인해, 리스트는 데이터를 묶어서 관리하거나 반복 처리할 때 매우 유용하게 사용한다.

 

위 사진은 Python에서 List를 만들게 되면 어떻게 메모리에 적재되는지 나타낸 그림이다.

 

기존의 변수와 구조가 살짝 다른데 설명을 하자면, 일반적인 변수를 통해 만들어진 메모리 공간과

 

리스트 요소가 저장된 메모리 공간은 참조하는 값이 같아도 서로 공유하지 않을 수 있다.

 

컬렉션으로 만들어진 값들은 별도로 구분되어 있다고 생각하자.

 

그리고, 리스트 요소들의 주소를 가리키는 하나의 묶음 공간이 만들어지는데

 

이것이 주소를 저장하는 하나의 변수라고 하자.

 

또, 리스트 객체가 만들어질 때, PyObject_Head 라는 구조체와 데이터 개수와

 

아까 묶음 공간을 가리키는 주소가 저장이 되는 공간 이 3가지로 구성이 되어 있다.

 

이를 간단하게 표현하면 아래 그림과 같다.

 

리스트 만들기

 

위에서 구조에 대해 알아보았다면, 이제 리스트 생성하는 방법을 알아보자.

 

리스트는 직접 리스트를 할당해 생성하는 방법튜플 등 다른 데이터 구조를 리스트로 타입 변환하는 함수를

 

이용하는 방법이 있다.

 

li1 = [1, 3, 5, 7, 9]
li2 = list((1, 3, 5, 7, 9))

 

 

리스트의 인덱싱

 

리스트의 각 항목은 위치(인덱스)를 가지고 있으며 인덱스를 통해 접근할 수 있다.

 

인덱스는 0부터 시작하며, 리스트의 하나의 요소를 꺼내는 작업이다.

 

결과는 꺼낸 하나의 값이며, 대괄호로 감싸지지 않는다.

 

li1 = [1, 3, 5, 7, 9]
print(li1)
print(li1[0]) # 첫번째 데이터
print(li1[-1]) # 마지막 데이터
print(li1[0] + li1[-1]) # 각 요소가 Int 요소이므로 + 연산 할 수 있다.

 

리스트의 슬라이싱

 

리스트의 일부분만을 추출하는 슬라이싱 작업은 여러 개 요소를 잘라서 새로운 리스트를 만드는 것이다.

 

즉, 결과는 대괄호로 감싸진 새로운 리스트이다.

 

리스트[start:end:step]

start : 어디서 시작할 지
end: 어디까지 갈지 (끝 인덱스는 포함하지 않는다.)
step: 몇 칸씩 이동할지 (생략 가능)

 

리스트의 항목 추가

 

슬라이싱 방식을 응용해 리스트의 항목을 추가할 수 있다.

li4 = [10, 20, 30, 40, 50]
li4[1:2] = ['😁','😂','😎','😍'] # 차원이 바뀌지 않음
print(li4)

 

리스트의 항목 변경 & 삭제

 

슬라이싱 방식을 이용해 삭제하려는 요소에 []을 할당하여 삭제한다.

 

c.f) 슬라이싱이 아닌 인덱싱 방식을 이용해 []를 할당하면 그 요소에 []가 추가되므로, 삭제되는 것이 아니다.

 

li4 = [10, 20, 30, 40, 50]
print(li4[1:3])
li4[1:3] = []
print(li4) # [10, 40, 50]

 

리스트 간의 결합

 

리스트 간의 + 연산으로 리스트를 결합할 수 있다.

 

리스트 간의 * 연산으로 리스트를 반복할 수 있다.

 

li5 = [10, 20, 30]
li6 = [40, 50, 60]
print(li5 + li6) # [10, 20, 30, 40, 50, 60]
print(li6 + li5) # [40, 50, 60, 10, 20, 30]

 

li6 = [10, 20, 30]
print(li6 * 3) # [10, 20, 30, 10, 20, 30, 10, 20, 30]

 

 

함수와 메소드

 

1. len() : 객체의 길이를 반환하는 기본적인 내장 함수

li6 = [10, 20, 30]
print(len(li6)) # 3

 

2. append() : 리스트 요소의 끝에 새로운 요소를 추가하는 메소드

 

단, append의 인자는 하나만 가능하다.

li6 = [10, 20, 30]
li6.append(100)
print(li6) # [10, 20, 30, 100]

 

3. extend() : 리스트의 끝에 새로운 여러 요소를 추가하는 메소드

li6 = [10, 20, 30]

li6.extend([200, 300, 400])
print(li6) # [10, 20, 30, 200, 300, 400]

 

4. pop() : 리스트 마지막 요소를 삭제하고 삭제된 요소를 반환

li6 = [10, 20, 30]
# print(li6.pop())
temp = li6.pop() # 반환 : 데이터를 끄집어내서 다른 변수에 저장할 수 있다.
print(li6) # [10, 20]
print(temp) # 30

 

5. index() : 리스트에서 특정 요소의 값 인덱스를 반환

li6 = [10, 20, 30]
# print(li6.index(30))
idx = li6.index(30) # 2
print(idx) # 2

 

6. reverse() : 리스트의 요소들을 순서를 반대로 설정

li7 = [100, 50, 70, 60, 20]
li7.reverse()
print(li7) # [20, 60, 70, 50, 100]

# 슬라이싱을 사용하여 리스트의 요소들의 순서를 바꾸는 방법
li7 = [100, 50, 70, 60, 20]

print(li7[::-1])
print(li7[4::-1])
print(li7[4:None:-1])

 

7. sort() : 리스트의 요소를 오름차순으로 정렬

li7 = [100, 50, 70, 60, 20]

li7.sort() # 오름차순
print(li7)

li7 = [100, 50, 70, 60, 20]

li7.sort(reverse=True)
print(li7)

li8 = ['Apple', 'apple', 'banana', 'melon', 'orange']
li8.sort() # ASCII 기준으로 정렬
print(li8)

li9 = ['김사과', '오렌지', '반하나', '오렌지', '이메론']
li9.sort() # UNICODE 기준으로 정렬
print(li9)

 

8. sorted() : 모든 요소를 정렬한 후 반환해주는 함수

li7 = [100, 50, 70, 60, 20]

returned = sorted(li7)

print(returned)
print(li7)

 

9. count() : 리스트에서 특정 요소의 갯수 반환

li9 = [10, 20, 30, 50, 20, 40, 30, 20]
print(li9)

print(li9.count(20))
print(li9.count(100))