Python

파이썬 자료구조: 리스트 완전 정리

초코너무조코 2025. 11. 25. 22:25
728x90

 

파이썬은 여러 개의 데이터를 효율적으로 다루기 위해 다양한 자료구조를 기본적으로 제공한다. C언어처럼 배열이나 연결 리스트를 직접 구현할 필요 없이, 파이썬에서는 리스트(list), 튜플(tuple), 딕셔너리(dict)와 같은 자료구조를 언어 자체에서 지원한다. 이번 글에서는 그중 가장 많이 사용하는 리스트(list)의 개념과 주요 기능을 정리한다.


1. 파이썬 자료구조란 무엇인가

자료구조(Data Structure)는 여러 데이터를 목적에 맞게 다루기 위한 기술이다. 파이썬은 기본적으로 다음과 같은 자료구조를 제공한다.

  • 리스트(list)
  • 튜플(tuple)
  • 딕셔너리(dict)

이 중 리스트는 가장 기본적이며 가장 자주 사용하는 자료구조다.


2. 파이썬 리스트의 개념

리스트는

  • 순서가 있으며
  • 수정 가능(mutable)한 자료구조다.

데이터를 순서대로 저장하고, 필요할 때 값을 바꾸고 추가하거나 삭제할 수 있는 구조다.

예시:

아이스크림 = ["월드콘", "메로나", "스크류바"]

 

리스트는 대괄호 [ ]로 묶으며, 값들은 콤마로 구분한다.
각 값은 0번부터 시작하는 인덱스를 가진다.

[0] 월드콘  
[1] 메로나  
[2] 스크류바

3. 리스트 인덱싱

문자열과 마찬가지로 리스트는 인덱스를 이용해 특정 위치의 값을 가져올 수 있다.

아이스크림 = ["월드콘", "메로나", "스크류바"]

print(아이스크림[0])   # 월드콘
print(아이스크림[1])   # 메로나
print(아이스크림[3])   # 존재하지 않아 에러

 

3번 인덱스는 없기 때문에 오류가 발생한다.


4. 리스트 슬라이싱

리스트도 문자열처럼 슬라이싱을 지원한다.

아이스크림 = ["월드콘", "메로나", "스크류바"]

print(아이스크림[0:2])   # 0 이상 2 미만 → ["월드콘", "메로나"]
print(아이스크림[1:3])   # ["메로나", "스크류바"]

 

시작 인덱스 포함, 끝 인덱스 미포함 규칙은 문자열과 동일하다.


5. 리스트 수정

리스트는 mutable 구조이기 때문에 값을 바꿀 수 있다.

아이스크림 = ["월드콘", "메로나", "스크류바"]
아이스크림[2] = "빵빠레"
print(아이스크림)

 

기존의 "스크류바"는 더 이상 참조되지 않으므로 메모리에서도 제거된다.


6. 리스트 추가(append)

append는 리스트 끝에 새로운 원소를 추가한다.

버킷리스트 = []
버킷리스트.append("파이썬 배우기")
버킷리스트.append("책 집필")
print(버킷리스트)

7. 리스트 삽입(insert)

특정 위치에 값을 넣고 싶다면 insert를 사용한다.

리스트.insert(인덱스, 값)

 

버킷리스트 = ["파이썬배우기", "리스트 공부", "자격증 공부"]
버킷리스트.insert(2, "해외여행")
print(버킷리스트)

 

2번 위치에 "해외여행"이 추가된다.


8. 리스트 원소 삭제(del)

특정 인덱스의 값을 삭제하려면 del을 사용한다.

버킷리스트 = ["파이썬배우기", "리스트 공부", "해외여행", "자격증 공부"]
del 버킷리스트[2]
print(버킷리스트)

 

삭제 이후 뒤의 값들은 앞으로 당겨진다.


9. 리스트 확장(extend)

두 리스트를 합쳐 첫 번째 리스트를 확장한다.

num1 = [1, 2, 3]
num2 = [4, 5, 6]
num1.extend(num2)
print(num1)

 

[1, 2, 3, 4, 5, 6]

10. 리스트의 최댓값·최솟값

내장 함수 max, min을 사용한다.

시세 = [47000, 46800, 45800, 47750, 47850]
최댓값 = max(시세)
최솟값 = min(시세)
print(최댓값, 최솟값)

11. 리스트 정렬(sorted, sort)

sorted

정렬된 새 리스트를 반환하며 원본은 유지된다.

price = [533, 504, 498, 506, 489]
price1 = sorted(price)
print(price1)

 

내림차순 정렬

price2 = sorted(price, reverse=True)

sort

원본 리스트 자체를 정렬한다.

price = [533, 504, 498, 506, 489]
price.sort()
print(price)

 

sorted와 sort의 차이는 간단하지만 매우 중요하다. 아래 표로 바로 구분할 수 있다.


sorted vs sort 차이 정리

구분 sorted() 리스트.sort()
동작 방식 정렬된 새 리스트를 반환 원본 리스트 자체를 정렬
원본 리스트 변화 없음 변화함(파괴적 정렬)
사용 방법 sorted(리스트) 리스트.sort()
반환 값 정렬된 리스트 None 반환
사용 대상 어떤 이터러블(iterable)이든 가능 리스트(list)만 가능

예시로 비교하면 더 분명해짐

1. sorted() 사용

price = [533, 504, 498]

result = sorted(price)

print(result)   # [498, 504, 533]
print(price)    # [533, 504, 498]  (원본 유지)

 

sorted는 원본을 건드리지 않고 새로운 정렬된 리스트를 반환한다.


2. sort() 사용

price = [533, 504, 498]

price.sort()

print(price)   # [498, 504, 533]
print(price.sort())  # None

 

sort는 리스트 자체를 정렬하며 반환값이 없다(None).


언제 어떤 것을 쓰면 좋나?

sorted() 사용

  • 원본 데이터를 보존해야 하는 경우
  • 정렬된 결과를 새로운 변수에 담고 싶은 경우
  • 리스트뿐만 아니라 문자열, 튜플 등 다른 iterable에도 적용하고 싶은 경우

sort() 사용

  • 원본 리스트를 바로 정렬해도 되는 경우
  • 데이터가 크고 메모리 효율이 중요할 때(원본 변경이 더 빠름)

결론

원본 유지 → sorted()
원본 변경 → sort()


12. 리스트 연결(덧셈 연산)

리스트 + 리스트 → 두 리스트를 이어붙인 새 리스트 생성

과자 = ["치토스", "썬칩", "양파링"]
아이스크림 = ["구구콘", "메로나", "비비빅"]
구매품목 = 과자 + 아이스크림
print(구매품목) #['치토스', '썬칩', '양파링', '구구콘', '메로나', '비비빅']

13. 인덱스 찾기(index)

리스트 안에서 특정 값이 몇 번째에 있는지 찾는다.

과자 = ["치토스", "썬칩", "양파링"]
과자.index("양파링") # 2

 

존재하지 않으면 오류 발생

과자.index("포카칩")  # ValueError

 

728x90