[포스코 신재생에너지 IoT 개발자 5기] Python 4편 — 리스트

Doohee·2025년 11월 23일
post-thumbnail

파이썬에서 리스트(list) 는 “여러 값을 순서대로 모아서, 마음대로 꺼내고 바꿀 수 있는 상자” 같은 존재다.

이번 글에서는 단순히 [] 문법만 보는 게 아니라,

  • 이터러블 / 컬렉션 / 시퀀스 개념

  • 리스트의 인덱싱 & 슬라이싱

  • 리스트 연산 (+, *, in, not in, del)

  • 리스트에서 자주 쓰는 메서드들

까지 한 번에 정리한다.

0. 용어정리: 이터러블, 컬렉션, 시퀀스

1) 이터러블(Iterable) 이란?

  • 반복(iteration)이 가능한 객체의 총칭

  • for 루프에서 순회할 수 있는 모든 것.

  • 예) list, tuple, set, dict, str, range, 제너레이터 등

list_1

2) 컬렉션(Collection) 자료형

  • 여러 개의 데이터를 하나의 변수에 묶어서 저장할 수 있는 자료형

  • "데이터 묶음(container)" 역할을 하는 타입

  • 컬렉션 공통 기능

    • in, not in: 포함 여부 검사

    • for: 요소 하나씩 순회

    • len(): 길이(요소 개수) 확인

list_2

list_3

3) 시퀀스(Sequence) 자료형

  • 순서가 있는 데이터 묶음, 핵심은 인덱스(index = 위치 번호)가 있다는 것.

  • 시퀀스 특징

    • 순서 존재: 0, 1, 2,... 인덱스로 접근 가능

    • 인덱싱: 특정 위치의 값 가져오기

    • 슬라이싱: 일부 구간 잘라서 새 시퀀스 만들기

    • 반복 가능: for로 순차 순회

  • 시퀀스에 속하는 주요 타입:

    • list, tuple : 컬렉션 이면서 시퀀스

    • set, dict: 컬렉션 이지만 "시퀀스"는 아님 (순서 개념이 다름)

list_4

1. 리스트(list) 기본

1) 리스트란?

  • 여러 값을 순서대로 저장할 수 있는 자료형

  • 인덱스로 각 항목에 접근할 수 있고, 추가·삭제·수정이 자유로운 가변 객체

  • 주요 특징

    • 순서 유지: 넣은 순서 그대로 저장

    • 중복 허용: 같은 값 여러 개 가능

    • 다양한 자료형 저장 가능: 정수, 실수, 문자열, 리스트까지 모두 가능

    • 가변(mutable): 안에 들어있는 값을 바꿀 수 있음

2) 리스트 표기법과 생성 함수

  • 리스트는 대괄호 []로 표현됨, 각 요소는 쉼표,로 구분, 다양한 자료형 저장 가능

list_5

  • 리스트 생성함수: list(), 이터러블을 리스트로 변환할 때 사용

list_6

※ 리스트 주요 연산의 시간복잡도 (Big-O)

  • 인덱싱: O(1)

  • append: 평균 O(1)

  • insert(0, x): O(n)

  • remove(x): O(n)

리스트는 가변 시퀀스로서 다양한 연산을 지원하지만, 어떤 연산은 리스트 길이에 따라 시간이 더 걸릴 수 있다.

2. 인덱싱 & 슬라이싱

1) 인덱싱(indexing) 기본

  • 시퀀스에서 "특정 위치의 값"을 가져오는 것.

  • 인덱스는 0 부터 시작

  • 음수 인덱스: 뒤에서부터 접근(-1 = 마지막)

list_7

2) 문자열 인덱싱 - 불변 자료형

  • 문자열(str)은 불변(immutable)이라서 값을 바꿀 수 없다.

list_8

3) 리스트 인덱싱 - 가변 자료형

  • 리스트는 가변(mutable) 이라서 인덱스를 통해 값을 수정할 수 있다.

list_9

4) 슬라이싱(Slicing) 기본

  • 시퀀스에서 특정 구간을 잘라서 새로운 시퀀스를 만드는 방법

  • 원본은 변경되지 않으며, 새로운 시퀀스를 생성함

  • start: 시작 인덱스(포함)

  • end: 끝 인덱스(불포함)

  • step: 간격(양수 / 음수 가능)

list_10

list_11

▶ 슬라이싱에서 start, end, step이 어떻게 적용되는지 시각화한 예(1)

list_12

▶ 슬라이싱에서 start, end, step이 어떻게 적용되는지 시각화한 예(2)

💡 슬라이싱은 항상 새 리스트(복사본)을 만든다.
큰 리스트를 반복적으로 슬라이싱하면 메모리 사용량이 늘어날 수 있다.

5) 문자열 슬라이싱

  • 문자열도 시퀀스 이므로 완전히 동일하게 슬라이싱 가능

    • start를 생략: 첫 번째 요소부터 슬라이싱

    • end를 생략: 마지막 요소까지 슬라이싱

    • start, end 모두 생략: 전체 복사

    • step-1을 사용해서 전체복사: 리스트를 반전해서 복사

list_13

6) 리스트 슬라이싱

  • 리스트도 문자열과 패턴이 동일하다.

list_14

  • 리스트 + 슬라이스 대입: 문자열과 다르게, 리스트는 슬라이스 범위에 새 값을 대입할 수도 있다.

list_15

▶ 슬라이싱 범위에 새로운 값을 할당해 리스트 구조가 변경되는 예시 (문자열과의 차이점)

실습1. 인덱싱, 슬라이싱

문제1. 첫 번째 요소와 마지막 요소 출력하기

nums = [10, 20, 30, 40, 50]

list_16

✔ 출력 결과

첫 번째 요소: 10
마지막 번째 요소: 50

문제2. 가운데 세 개의 요소 추출하기

nums = [100, 200, 300, 400, 500, 600, 700]

list_17

✔ 출력 결과

가운데 요소: [300, 400, 500]

문제3. 리스트의 원소 두배 하기

nums = [1, 2, 3, 4, 5]

list_18

✔ 출력 결과

모든 원소의 두배: [2, 4, 6, 8, 10]

문제4. 리스트 뒤집어서 출력하기

items = ["a", "b", "c", "d", "e"]

list_19

✔ 출력 결과

리스트의 역순: ['e', 'd', 'c', 'b', 'a']

문제5. 짝수 인덱스 요소만 출력하기

data = ["zero", "one", "two", "three", "four", "five"]

list_20

✔ 출력 결과

짝수 인덱스: ['zero', 'two', 'four']

문제6. 슬라이싱으로 리스트 수정하기

movies = ["인셉션", "인터스텔라", "어벤져스", "라라랜드", "기생충"]

  • 슬라이싱으로 "어벤져스", "라라랜드" ⇒ "매트릭스", "타이타닉" 으로 바꾸기

list_21

✔ 출력 결과

영화 리스트 수정: ['인셉션', '인터스텔라', '매트릭스', '타이타닉', '기생충']

문제7. 특정 규칙에 따라 요소 추출

subjects = ["국어", "수학", "영어", "물리", "화학", "생물", "역사", "지구과학", "윤리"]

  • 다음 리스트에서 "물리", "생물", "지구과학" 만 순서대로 추출하여 새 리스트로 만들기

list_22

✔ 출력 결과

새 리스트: ['물리', '생물', '지구과학']

문제8. 리스트를 3개 구간으로 나누어 역순 병합

data = ["A", "B", "C", "D", "E", "F", "G", "H", "I"]

  • 다음 리스트를 [1 ~ 3번째 요소] + [4 ~ 6번째 요소] + [7 ~ 9번째 요소] 순서로 세 구간을 나눈 뒤,

  • 각 구간을 역순으로 따로 출력하세요. 단, 출력 시 한 줄로 출력되게 출력해주세요.

list_23

✔ 출력 결과

['C', 'B', 'A'] ['F', 'E', 'D'] ['I', 'H', 'G']

3. 리스트 연산

1) del - 리스트 요소 삭제

  • del 은 파이썬의 내장 키워드로, 객체를 삭제(delete) 하는데 사용됨.

  • del은 범용 삭제 키워드: 리스트의 요소뿐 아니라 슬라이스 범위 삭제, 변수 자체, 딕셔너리의 키, 객체 속성 등도 삭제할 수 있음

list_24

  • 특정 요소 삭제

list_25

  • 슬라이싱 범위 삭제

list_26

  • 전체 리스트 객체 삭제

list_27

2) 리스트 연결 - (+)

  • + 연산자로 두 리스트를 이어 붙여 하나의 새로운 리스트를 생성

  • 원본 리스트는 변경되지 않고, 새로운 리스트 객체가 만들어짐

list_28

  • 연산결과 ⇒ 새로운 리스트 반환

list_29

3) 리스트 반복 - (*)

  • * 연산자로 리스트를 지정한 횟수 만큼 반복하여 새로운 리스트를 생성

  • 원본 리스트는 변경되지 않고, 새로운 리스트 객체가 만들어짐

  • 반복된 리스트의 요소들은 원래 순서를 유지함

list_30

  • 반복하는 배열의 요소들의 순서는 변함 X

  • 연산결과 ⇒ 새로운 리스트 반환

list_31

4) 포함 여부 검사 - (in, not in)

  • 특정 값이 리스트에 포함되어 있는지 확인

list_32

🔑 리스트 연산 핵심 요약

  • + / *는 항상 새 리스트 생성

  • del, 슬라이스 삭제는 항상 원본을 직접 수정

  • in / not inTrue / False 반환

실습2. 리스트 연산

문제1. 부분 삭제 후 연결

  • 다음 리스트에서 가운데 3개 요소 ["Banana", "Cherry", "Grape"] 를 삭제한 뒤

  • 나머지 앞 / 뒤 리스트를 연결하여 새 리스트 result를 출력하세요.

  • fruits = ["Apple", "Banana", "Cherry", "Grape", "Watermelon", "Strawberry"]

list_33

✔ 출력 결과

['Apple', 'Watermelon', 'Strawberry']

문제2. 반복 리스트 내부 요소 삭제

  • 다음 리스트를 3번 반복한 후, 전체 결과에서 중간에 있는 "A"만 삭제하세요

  • 최종 리스트 출력

  • letters = ["A", "B"]

list_34

✔ 출력 결과

['A', 'B', 'B', 'A', 'B']

4. 주요 메서드

1) len(): 길이(요소 개수) 반환

  • 시퀀스나 컬렉션 자료형의 요소 개수를 반환

  • 문자열, 튜플, 셋, 딕셔너리에도 사용 가능

list_35

2) append(x): 리스트 끝에 요소 추가

  • 한 개의 요소를 리스트 맨 뒤에 붙인다.

  • 리스트 자체가 바뀐다. (원본 수정)

list_36

3) extend(iterable): 리스트 끝에 여러 요소 추가

  • 전달된 이터러블의 모든 요소를 풀어서 뒤에 붙임

  • 역시 원본 수정

list_37

4) insert(index, x): 원하는 위치에 요소 삽입

  • index 위치에 새 값을 끼워 넣는다

  • 이후 요소들은 한 칸씩 뒤로 밀림

list_38

5) remove(x): 특정 값을 찾아 삭제

  • 가장 처음 발견된 해당 값(x)를 삭제함

  • 값이 없으면 ValueError 발생

list_39

6) pop(index): 인덱스 요소를 꺼내고 삭제

  • 인덱스를 지정하면 해당하는 인덱스의 요소를 삭제하고 반환함

  • 인덱스를 지정하지 않으면 마지막 요소를 삭제하고 반환함

list_40

7) sort(), sorted(): 리스트 정렬

= list.sort(): 원본을 변경,

  • sorted(list): 정렬된 새로운 리스트 반환, 원본 유지

  • 오름차순이 기본이며, reverse = True 옵션을 주면 내림차 순으로 정렬 됨

list_41

▶ sort()는 원본 변경, sorted()는 새로운 리스트 생성

8) reverse(): 리스트 요소를 뒤집기

  • 리스트 자체를 뒤집는 원본 수정 메서드

  • number[::-1]새 리스트를 돌려준다는 점과 차이 기억!

list_42

9) count(x): 값의 개수 세기

  • 값(x)의 개수를 세서 반환

list_43

10) max(), min(): 최대 / 최소값 찾기

list_44

11) sum(): 요소들의 합 구하기

list_45

📌 원본 수정 vs 새 객체 생성 요약표

list_48

실습3. 리스트 주요 메서드

문제1. 기차 탑승 시뮬레이션

  • 기차에 승객들이 순서대로 탑승하고 있습니다.

  • 처음엔 ["철수", "영희"]가 탑승했습니다.

  • 그 다음 역에서 ["민수", "지훈"]이 함께 탑승했습니다.

  • 다음 역에서 "영희"는 내렸습니다.

  • "수진"1번 자리에 탑승했습니다.

  • 마지막 역에서 "민수"가 내렸고, 기차 안의 순서를 뒤집었습니다.

  • 현재 기차 안에는 어떤 승객들이 어떤 순서로 앉아있을까요?

list_46

✔ 출력 결과

마지막 탑승 순서: ['지훈', '철수', '수진']

문제2. 숫자 처리 게임

  • 숫자 카드 게임에서 다음 리스트가 주어졌습니다. [5, 3, 7]

  • 2장을 더 추가해서 [4, 9]가 들어옵니다.

  • 가장 큰 수와 가장 작은 수를 각각 구해 출력하세요.

  • 총합을 출력하세요.

  • 리스트를 정렬한 다음, 마지막 숫자를 제거하세요.

  • 최종 리스트를 출력하세요.

list_47

✔ 출력 결과

리스트 추가 후: [5, 3, 7, 4, 9]
가장 큰 수: 9 / 가장 작은 수: 3
총 합계: 28
리스트를 정렬: [3, 4, 5, 7, 9]
마지막 숫자 제거: 9
최종 리스트: [3, 4, 5, 7]

❗ 초보자가 자주 실수하는 부분 정리

  • 문자열은 불변이라 text[0] = 'a' 불가

  • list * 3 은 리스트 내부 요소를 '복사'한 새로운 리스트

  • remove(x)는 x가 없으면 ValueError 발생

  • sort()는 원본을 정렬하고 반환값이 None 이라는 점 주의

  • pop()삭제 + 반환 / remove()삭제만 한다.

5. 마무리 정리

이번 글에서 정리한 내용:

1) 이터러블 / 컬렉션 / 시퀀스 개념 정리

2) 리스트의 특징 – 순서, 중복 허용, 가변성

3) 인덱싱 / 슬라이싱 – 문자열·리스트 모두 사용 가능

4) 리스트 연산: del, +, *, in / not in

5) 리스트 주요 메서드:

- append, extend, insert

- remove, pop

- sort, sorted, reverse

- len, count, max, min, sum

6) 실습 문제로 인덱싱·슬라이싱·연산·메서드 감각 익히기

✔️ 체크포인트

리스트를 시퀀스 + 가변 컬렉션으로 이해하면 인덱싱 / 슬라이싱 + 메서드 사용이 한 번에 정리된다.

“원본을 바꾸는 애 vs 새 리스트를 만드는 애” 꼭 구분해 두기.

📌 다음 글 연결을 위한 미리보기

리스트는 값을 자유롭게 변경할 수 있는 가변(mutable) 자료형이다.

반면, 다음 글에서 다룰 튜플(tuple)불변(immutable) 자료형이기 때문에 값을 수정할 수 없다는 차이가 있다.

6. 아웃트로

이번 글에서는 파이썬에서 가장 많이 쓰이는 컬렉션인 리스트(list)

“자료형 개념 → 인덱싱·슬라이싱 → 연산 → 메서드 → 실습” 순으로 정리해 봤다.

다음 글에서는 리스트와 함께 자주 쓰이는 튜플(tuple), 집합(set), 딕셔너리(dict) 를 이어서 정리할 예정.

profile
에너지 기획 전문가로 성장하고자 합니다.

0개의 댓글