본문 바로가기
Python

12. 리스트 - 데이터를 줄 세우기

by 샤나엘 2026. 2. 22.
반응형

리스트 - 데이터를 줄 세우기

12. 리스트 - 데이터를 줄 세우기

학생 30명의 점수를 저장하려면 변수 30개가 필요할까? 아니다. 리스트 하나면 된다. 파이썬에서 가장 많이 쓰이는 자료구조인 리스트를 철저하게 파헤쳐보자.


리스트란?

여러 값을 하나의 변수에 순서대로 저장하는 자료구조다.

# 변수를 여러 개 만드는 대신...
score1 = 85
score2 = 92
score3 = 78

# 리스트 하나로!
scores = [85, 92, 78]

 

리스트의 구조

리스트 만들기

# 숫자 리스트
numbers = [1, 2, 3, 4, 5]

# 문자열 리스트
fruits = ["사과", "바나나", "포도"]

# 섞어서 담기 (가능하지만 보통은 같은 타입끼리)
mixed = [1, "hello", True, 3.14]

# 빈 리스트
empty = []

인덱싱과 슬라이싱

4편(문자열)에서 배운 인덱싱과 슬라이싱이 리스트에도 똑같이 적용된다.

인덱싱

fruits = ["사과", "바나나", "포도", "딸기", "수박"]

print(fruits[0])     # 사과 (첫 번째)
print(fruits[2])     # 포도 (세 번째)
print(fruits[-1])    # 수박 (마지막)
print(fruits[-2])    # 딸기 (뒤에서 두 번째)
인덱스 0 1 2 3 4
사과 바나나 포도 딸기 수박
역방향 -5 -4 -3 -2 -1

슬라이싱

numbers = [10, 20, 30, 40, 50, 60, 70]

print(numbers[1:4])    # [20, 30, 40]
print(numbers[:3])     # [10, 20, 30]
print(numbers[4:])     # [50, 60, 70]
print(numbers[::2])    # [10, 30, 50, 70]  (2칸 간격)
print(numbers[::-1])   # [70, 60, 50, 40, 30, 20, 10]  (역순)

리스트 값 수정

문자열과 달리 리스트는 수정 가능(mutable)하다!

fruits = ["사과", "바나나", "포도"]
fruits[1] = "망고"     # 바나나 → 망고로 변경
print(fruits)          # ['사과', '망고', '포도']

리스트 주요 메서드

리스트 주요 메서드

추가 메서드

fruits = ["사과", "바나나"]

# append: 맨 끝에 추가
fruits.append("포도")
print(fruits)   # ['사과', '바나나', '포도']

# insert: 원하는 위치에 삽입
fruits.insert(1, "딸기")
print(fruits)   # ['사과', '딸기', '바나나', '포도']

# extend: 리스트를 합치기
fruits.extend(["수박", "키위"])
print(fruits)   # ['사과', '딸기', '바나나', '포도', '수박', '키위']

삭제 메서드

fruits = ["사과", "바나나", "포도", "딸기", "수박"]

# remove: 값으로 삭제 (첫 번째 일치)
fruits.remove("포도")
print(fruits)   # ['사과', '바나나', '딸기', '수박']

# pop: 인덱스로 삭제 (삭제한 값 반환)
removed = fruits.pop(1)
print(removed)  # 바나나
print(fruits)   # ['사과', '딸기', '수박']

# pop(): 마지막 요소 삭제
last = fruits.pop()
print(last)     # 수박

# clear: 전부 삭제
fruits.clear()
print(fruits)   # []

탐색 메서드

numbers = [3, 1, 4, 1, 5, 9, 2, 6]

# index: 값의 위치 찾기
print(numbers.index(5))    # 4

# count: 값의 개수 세기
print(numbers.count(1))    # 2

# in: 포함 여부
print(5 in numbers)        # True
print(10 in numbers)       # False

정렬 메서드

numbers = [3, 1, 4, 1, 5, 9, 2, 6]

# sort: 원본을 정렬 (오름차순)
numbers.sort()
print(numbers)   # [1, 1, 2, 3, 4, 5, 6, 9]

# sort(reverse=True): 내림차순
numbers.sort(reverse=True)
print(numbers)   # [9, 6, 5, 4, 3, 2, 1, 1]

# reverse: 순서 뒤집기
numbers.reverse()
print(numbers)   # [1, 1, 2, 3, 4, 5, 6, 9]

⚠️ sort() vs sorted(): sort()는 원본 리스트를 변경하고, sorted()는 원본은 그대로 두고 새 리스트를 반환한다.

original = [3, 1, 4, 1, 5]

new_list = sorted(original)
print(original)   # [3, 1, 4, 1, 5]  (그대로!)
print(new_list)   # [1, 1, 3, 4, 5]  (새 리스트)
메서드 기능 예시
append(x) 맨 끝에 추가 lst.append(10)
insert(i, x) i번 위치에 삽입 lst.insert(0, 99)
extend(lst2) 리스트 합치기 lst.extend([1,2])
remove(x) 값 x 삭제 (첫 번째) lst.remove("a")
pop(i) i번째 삭제 + 반환 lst.pop(0)
sort() 오름차순 정렬 (원본 변경) lst.sort()
reverse() 순서 뒤집기 lst.reverse()

리스트 연산

# + : 리스트 합치기
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)      # [1, 2, 3, 4, 5, 6]

# * : 반복
print([0] * 5)    # [0, 0, 0, 0, 0]

# len() : 길이
print(len(a))     # 3

# sum(), min(), max()
numbers = [10, 20, 30, 40, 50]
print(sum(numbers))   # 150
print(min(numbers))   # 10
print(max(numbers))   # 50

리스트와 반복문

리스트는 for문과 함께 쓸 때 진가를 발휘한다.

fruits = ["사과", "바나나", "포도", "딸기"]

# 기본 순회
for fruit in fruits:
    print(fruit)

# enumerate: 인덱스와 함께
for i, fruit in enumerate(fruits):
    print(f"{i+1}. {fruit}")

# 조건 필터링
scores = [85, 42, 90, 67, 55, 93, 78]
passed = []
for score in scores:
    if score >= 60:
        passed.append(score)
print(f"합격: {passed}")   # [85, 90, 67, 93, 78]

2차원 리스트

리스트 안에 리스트를 넣으면 표(테이블)처럼 데이터를 관리할 수 있다.

# 3x3 행렬
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 접근: matrix[행][열]
print(matrix[0][0])   # 1 (1행 1열)
print(matrix[1][2])   # 6 (2행 3열)
print(matrix[2][1])   # 8 (3행 2열)

# 전체 출력
for row in matrix:
    for num in row:
        print(f"{num:3d}", end="")
    print()
# 학생 성적 관리
students = [
    ["김철수", 85, 90, 78],
    ["이영희", 92, 88, 95],
    ["박민수", 78, 82, 80]
]

for name, kor, eng, math in students:
    avg = (kor + eng + math) / 3
    print(f"{name}: 평균 {avg:.1f}점")
김철수: 평균 84.3점
이영희: 평균 91.7점
박민수: 평균 80.0점

리스트 복사 주의사항

# 이렇게 하면 복사가 아니라 '같은 리스트'를 가리킨다!
a = [1, 2, 3]
b = a           # 같은 객체를 참조
b[0] = 999
print(a)        # [999, 2, 3]  ← a도 바뀜!

# 진짜 복사 방법
a = [1, 2, 3]
b = a[:]        # 슬라이싱으로 복사
c = a.copy()    # copy() 메서드
d = list(a)     # list() 함수

b[0] = 999
print(a)        # [1, 2, 3]  ← a는 그대로!

⚠️ 핵심: b = a는 복사가 아니라 같은 리스트를 함께 가리키는 것이다. 독립적인 복사본이 필요하면 a[:], a.copy(), list(a) 중 하나를 사용하자.


실전 예시: 성적 관리 프로그램

scores = []

print("=" * 30)
print("   성적 입력 프로그램")
print("=" * 30)

while True:
    score = input("점수 입력 (q: 종료): ")
    if score == "q":
        break
    scores.append(int(score))

if scores:
    print(f"\n입력한 점수: {scores}")
    print(f"총 {len(scores)}명")
    print(f"합계: {sum(scores)}점")
    print(f"평균: {sum(scores)/len(scores):.1f}점")
    print(f"최고: {max(scores)}점")
    print(f"최저: {min(scores)}점")

    # 정렬해서 보여주기
    sorted_scores = sorted(scores, reverse=True)
    print(f"순위: {sorted_scores}")
else:
    print("입력한 점수가 없습니다.")

직접 해보기

문제 1. 숫자 리스트에서 짝수만 골라 새 리스트를 만들어보자.

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 결과: [2, 4, 6, 8, 10]

문제 2. 두 리스트의 공통 요소를 찾아보자.

a = [1, 3, 5, 7, 9]
b = [2, 3, 5, 8, 9]
# 결과: [3, 5, 9]

문제 3. 리스트에서 중복을 제거해보자 (순서 유지).

data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
# 결과: [3, 1, 4, 5, 9, 2, 6]

문제 4. 학생 점수 리스트에서 상위 3명의 점수를 출력해보자.

scores = [67, 93, 85, 42, 78, 95, 88, 71]
# 결과: 1등: 95점, 2등: 93점, 3등: 88점
정답 보기
# 문제 1
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = []
for n in numbers:
    if n % 2 == 0:
        evens.append(n)
print(evens)    # [2, 4, 6, 8, 10]
‍
# 문제 2
a = [1, 3, 5, 7, 9]
b = [2, 3, 5, 8, 9]
common = []
for x in a:
    if x in b:
        common.append(x)
print(common)    # [3, 5, 9]
‍
# 문제 3
data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
unique = []
for x in data:
    if x not in unique:
        unique.append(x)
print(unique)    # [3, 1, 4, 5, 9, 2, 6]
‍
# 문제 4
scores = [67, 93, 85, 42, 78, 95, 88, 71]
top3 = sorted(scores, reverse=True)[:3]
for i, score in enumerate(top3, start=1):
    print(f"{i}등: {score}점")

오늘의 정리

항목 내용
리스트 생성 [값1, 값2, ...] — 순서가 있고, 수정 가능
인덱싱/슬라이싱 문자열과 동일. lst[0], lst[1:3], lst[::-1]
주요 메서드 append, insert, remove, pop, sort, reverse, index, count
내장 함수 len(), sum(), min(), max(), sorted()
복사 주의 b = a는 참조 복사! 진짜 복사는 a[:] 또는 a.copy()

다음 편 예고: 딕셔너리 - 이름표를 붙인 데이터

리스트는 인덱스(번호)로 접근했다면, 딕셔너리는 이름(키)으로 접근한다. "학생 이름으로 점수 찾기" 같은 작업이 훨씬 직관적으로 가능해진다.


태그: 파이썬 Python 파이썬독학 리스트 list 인덱싱 슬라이싱 append 자료구조 파이썬기초 IT교육

반응형

댓글