기본 콘텐츠로 건너뛰기

방송대 방통대 파이썬프로그래밍기초 8강 - 컬렉션과 리스트의 활용 및 조작 - 요약 노트 시험족보 예상문제 - 올에이클래스

파이썬프로그래밍기초 8강 - 컬렉션과 리스트의 활용 및 조작

파이썬프로그래밍기초 8강 - 컬렉션과 리스트의 활용 및 조작

여러 데이터를 하나의 구조로 다루는 컬렉션의 개념과 리스트·튜플·세트·딕셔너리의 차이를 학습한다. 이어서 리스트의 인덱싱, 연산자, 내장함수와 메소드, 슬라이싱과 리스트 컴프리헨션을 활용해 데이터를 효율적으로 처리하는 방법을 살펴본다.

제1장 컬렉션의 이해

1. 컬렉션의 정의

컬렉션은 여러 데이터를 묶어 하나의 구조로 다루기 위해 제공되는 자료구조의 총칭이다. 프로그램에서는 같은 종류의 값뿐 아니라 서로 다른 자료형의 값도 하나의 컬렉션에 저장하고, 필요한 값을 검색·변경·반복 처리한다.

파이썬 컬렉션은 데이터 저장방식에 따라 시퀀스, 비시퀀스와 매핑으로 구분할 수 있다. 리스트와 튜플은 저장 순서를 유지하는 시퀀스이고, 세트는 순서가 없는 비시퀀스이다. 딕셔너리는 키와 값을 대응시키는 매핑 자료구조이다.

컬렉션의 목적

다수의 데이터를 효율적으로 저장·관리하고 데이터 분석, 네트워크 통신, 파일 처리 등 다양한 프로그램의 기본 구조로 활용하는 것이다.

2. 리스트

리스트(list)는 데이터를 순서 있게 저장하는 가변(mutable) 시퀀스이다. 서로 다른 자료형을 함께 저장할 수 있으며, 생성한 뒤에도 원소를 추가·삭제·수정할 수 있다. 대괄호로 생성하거나 list() 함수를 사용한다.

body = [181, 78, "dark brown", "black"]
body.append(78)

각 원소는 저장 순서에 따른 인덱스를 갖는다. 데이터가 자주 변하거나 원소를 순서대로 처리해야 하는 경우에 적합하다.

3. 튜플

튜플(tuple)은 데이터를 순서 있게 저장하는 불변(immutable) 시퀀스이다. 한 번 생성하면 원소의 값을 바꿀 수 없도록 설계되어 의도하지 않은 데이터 변경을 막는다. 리스트보다 메모리 효율이 좋고 순회가 빠르다는 장점이 있다.

body = (181, 78, "dark brown", "black")

소괄호 또는 tuple()로 생성한다. 좌표, 설정값처럼 프로그램 실행 중 바뀌지 않아야 하는 순서 있는 데이터를 표현할 때 유용하다.

4. 세트

세트(set)는 중복을 허용하지 않고 저장 순서를 유지하지 않는 컬렉션이다. 수학의 집합 개념을 구현하며 각 원소의 고유성을 보장한다. 중복된 값을 자동으로 제거하므로 데이터 정제와 고유값 추출에 유용하다.

items = ["apple", "banana", "apple", "orange"]
unique_items = set(items)
# {'apple', 'banana', 'orange'} - 출력 순서는 달라질 수 있음

중괄호 또는 set()으로 생성하지만, 빈 세트를 만들 때는 반드시 set()을 사용해야 한다. 빈 중괄호 {}는 빈 딕셔너리를 만든다.

5. 딕셔너리

딕셔너리(dictionary)는 키-값 쌍으로 데이터를 저장하는 매핑 자료구조이다. 키를 이용하여 대응하는 값을 빠르게 검색한다. 키는 중복될 수 없고 불변 객체만 사용할 수 있지만, 값에는 어떤 자료형도 저장할 수 있다.

body = {
    "키": 181,
    "몸무게": 78,
    "눈": "dark brown",
    "머리": "black"
}
print(body["눈"])

딕셔너리는 중괄호 또는 dict()로 생성한다. 이름 있는 속성을 한데 묶어 관리할 때 인덱스보다 의미 있는 키로 값을 찾을 수 있다는 장점이 있다.

6. 컬렉션 비교

자료구조순서변경생성핵심 특징
list있음가능[], list()순서 있는 가변 시퀀스
tuple있음불가능(), tuple()순서 있는 불변 시퀀스
set없음가능{...}, set()중복 없는 고유 원소
dictionary인덱스 순서 대신 키로 접근가능{key: value}, dict()키와 값의 매핑

선택 기준

순서와 변경이 필요하면 리스트, 순서가 있으나 변경을 막아야 하면 튜플, 중복 제거와 집합 처리가 필요하면 세트, 이름 있는 키로 값을 찾으려면 딕셔너리를 선택한다.

제2장 리스트의 활용

1. 리스트 원소의 접근

리스트 원소에는 대괄호와 인덱스 번호로 접근한다. 양수 인덱스는 왼쪽 첫 원소를 0으로 시작하며, 음수 인덱스는 오른쪽 마지막 원소를 -1로 시작한다.

hei_list = [1, 5, 14, 26, 31]
print(hei_list[4])   # 31
print(hei_list[-3])  # 14

인덱스 범위를 벗어난 위치에 접근하면 오류가 발생한다. 원소의 개수가 n개라면 양수 인덱스는 0부터 n-1까지이고 음수 인덱스는 -1부터 -n까지이다.

인덱스 대응

마지막 원소는 list[-1], 뒤에서 세 번째 원소는 list[-3]으로 접근한다.

2. 리스트 관련 연산자

연산자사용 예의미
inx in s원소 x가 시퀀스 s에 포함되는지 검사
not inx not in s원소 x가 포함되지 않았는지 검사
+s1 + s2두 리스트를 연결하여 새 리스트 생성
*s * n리스트 원소를 n회 반복하여 연결
비교 연산자s1 < s2앞 원소부터 사전식으로 비교
hei1 = [1, 5, 14, 26, 31]
hei2 = [1, 7, 45]

print(26 in hei1)   # True
print(hei1 + hei2)  # 두 리스트 연결
print(hei2 * 3)     # hei2 원소를 3번 반복

3. 리스트 관련 내장함수

내장함수는 특정 객체의 메소드가 아니라 파이썬이 기본으로 제공하는 함수이다. 리스트를 인수로 전달해 원소 수, 최솟값, 최댓값과 합계를 계산할 수 있다.

함수의미
len(s)리스트 s의 원소 개수
min(s)가장 작은 원소
max(s)가장 큰 원소
sum(s)모든 수치 원소의 합

len(hei2)는 3이고 max(hei1)은 31이다. 두 리스트 길이는 len(hei1) < len(hei2)와 같이 비교할 수 있다.

4. 객체와 메소드

객체지향 프로그래밍에서 메소드는 클래스 내부에 정의된 함수이다. 메소드는 해당 객체의 데이터에 접근하여 특정 작업을 수행한다. 리스트 메소드는 객체.메소드(인자) 형식으로 호출한다.

hei_list = [1, 5, 14, 26, 31]
hei_list.append(27)

위 코드에서 hei_list는 리스트 객체이고 append는 리스트 끝에 27을 추가하는 메소드이다.

5. 리스트 주요 메소드

메소드의미
append(x)원소 x를 리스트 끝에 추가
count(x)리스트에 x가 나타나는 횟수 반환
index(x)x가 처음 나타나는 인덱스 반환
pop(i)i 위치의 원소를 삭제하면서 반환, 생략 시 마지막 원소
insert(i, x)i 위치에 x 삽입
remove(x)처음 나타나는 x를 삭제
reverse()원소 순서를 역순으로 변경
sort()원소를 오름차순으로 정렬

반환값에 주의

pop()은 삭제한 원소를 반환하지만 append(), sort(), reverse() 등은 리스트 자체를 변경하고 보통 None을 반환한다.

6. 유효 평균값과 중앙값

강의록은 점수 리스트에서 가장 높은 점수와 가장 낮은 점수를 하나씩 제거한 뒤 유효 평균값과 중앙값을 구하는 문제를 제시한다. 복사한 리스트를 정렬하고 양 끝 원소를 제거하면 남은 값으로 평균과 중앙값을 계산할 수 있다.

scores = [9, 8, 10, 7, 9, 8, 10, 6, 9, 8, 7, 9, 10, 8, 9, 5, 8, 9, 7]
valid = scores.copy()
valid.remove(max(valid))
valid.remove(min(valid))
valid.sort()

average = sum(valid) / len(valid)
median = valid[len(valid) // 2]

print(f"유효 평균값은 {average:.2f}입니다")
print(f"중앙값은 {median}입니다")

강의록의 결과는 유효 평균값 8.29, 중앙값 8이다. 평균은 합계를 원소 수로 나눈 값이고 중앙값은 정렬된 데이터의 가운데 값이다. 최고·최저점 제거는 max, min, remove의 결합 사례이다.

제3장 리스트의 조작

1. 리스트 슬라이싱

슬라이싱은 대상 리스트에서 연속된 부분 리스트를 만드는 기능이다. 형식은 리스트[시작인덱스:끝인덱스:간격]이다. 시작 인덱스의 원소는 포함하지만 끝 인덱스의 원소는 포함하지 않는다.

hei_list = [1, 5, 14, 26, 31]
sub_hei1 = hei_list[:3]   # [1, 5, 14]
sub_hei2 = hei_list[-3:]  # [14, 26, 31]

시작을 생략하면 처음부터, 끝을 생략하면 마지막까지 선택한다. 음수 인덱스도 사용할 수 있어 뒤쪽의 일부를 편리하게 가져올 수 있다.

2. 간격을 이용한 슬라이싱

세 번째 값인 간격을 사용하면 일정한 위치마다 원소를 선택하거나 역순 리스트를 만들 수 있다.

numbers = [1, 5, 14, 26, 31]
sub_hei1 = numbers[::2]   # [1, 14, 31]
sub_hei2 = numbers[::-1]  # [31, 26, 14, 5, 1]

[::2]는 처음부터 끝까지 두 칸 간격으로 선택한다. [::-1]은 간격이 -1이므로 뒤에서 앞으로 이동하여 역순 복사본을 만든다.

슬라이싱 규칙

[start:stop:step]에서 start는 포함, stop은 제외한다. step이 음수이면 역방향으로 이동한다.

3. 리스트 컴프리헨션

리스트 컴프리헨션은 리스트를 간결하게 생성·조작하는 Pythonic 표현이다. 반복문으로 새 리스트에 원소를 하나씩 추가하는 과정을 한 줄로 표현할 수 있다.

[표현식 for 변수 in 리스트]
[표현식 for 변수 in 리스트 if 조건]

코드가 짧아지고 가독성이 좋아지며 일반적인 반복문보다 빠른 경우가 있다. 조건을 추가하면 필요한 데이터만 필터링하여 새 리스트로 만들 수 있다.

4. 반복문과 컴프리헨션 비교

# 반복문 방식
hei_list = []
for i in [1, 5, 14, 26, 31]:
    hei_list.append(i)

# 리스트 컴프리헨션
hei_list = [i for i in [1, 5, 14, 26, 31]]

두 코드는 같은 리스트를 만든다. 컴프리헨션에서는 생성할 원소의 표현식과 반복 대상이 한 문장에 들어 있어 데이터 변환의 의도가 잘 드러난다.

5. 변환과 조건 적용

hei_list = [1, 5, 14, 26, 31]

hei_square = [h ** 2 for h in hei_list]
hei_len = [len(str(h)) for h in hei_list]
hei_even = [h for h in hei_list if h % 2 == 0]
hei_hi = [h for h in hei_list if h > 20]

hei_square는 각 원소의 제곱, hei_len은 원소를 문자열로 바꾼 뒤 문자 길이를 저장한다. hei_even은 짝수만, hei_hi는 20보다 큰 값만 선택한다. 표현식은 변환을, 뒤의 조건은 필터링을 담당한다.

6. 이동평균 구하기

강의록은 30일간의 주가 리스트에서 주가가 단기 흐름을 보기 위해 연속 3일의 평균인 3일 이동평균을 계산하고, 그 값이 11,000원보다 큰 시작일과 평균을 출력하는 문제를 제시한다.

각 시작 위치 i에서 prices[i:i+3]으로 3일 구간을 슬라이싱하고 sum()len()으로 평균을 계산한다. 마지막 3일 구간까지 계산하려면 시작 인덱스를 0부터 len(prices)-3까지 이동한다.

for i in range(len(prices) - 2):
    window = prices[i:i + 3]
    moving_average = sum(window) / len(window)
    if moving_average > 11000:
        print(f"시작일 = {i + 1}, 이동평균값 = {moving_average:.2f}")

강의록의 출력에는 시작일 9, 11, 17, 18, 19, 25, 27 등이 조건을 만족하는 사례로 제시된다. 이 문제는 슬라이싱, 반복, 내장함수, 조건문과 형식화 출력을 결합한 응용이다.

이동평균의 의미

연속된 일정 기간의 평균을 시작 위치를 옮겨가며 계산하여 일별 값의 급격한 변동을 완화하고 단기적인 흐름을 살펴보는 방법이다.

핵심 개념 정리

컬렉션

리스트는 순서 있는 가변 시퀀스, 튜플은 순서 있는 불변 시퀀스, 세트는 중복이 없고 순서가 없는 컬렉션, 딕셔너리는 키와 값의 매핑이다. 데이터의 순서·변경·고유성·검색방법에 따라 적절한 구조를 선택한다.

리스트 활용

양수 인덱스는 0부터, 음수 인덱스는 -1부터 시작한다. in, +, *와 비교 연산자를 사용할 수 있고 len, min, max, sum 내장함수로 기본 통계를 계산한다. append, count, index, pop, insert, remove, reverse, sort 메소드로 리스트를 변경한다.

리스트 조작

슬라이싱은 [start:stop:step] 형식이며 stop은 제외한다. 리스트 컴프리헨션은 표현식, 반복과 선택 조건을 한 문장에 구성하여 리스트를 Pythonic하게 생성·변환·필터링한다.

응용

평균·중앙값 문제는 최댓값과 최솟값 제거, 정렬과 내장함수를 결합한다. 이동평균은 슬라이싱으로 연속 구간을 만들고 평균을 계산하여 조건을 만족하는 구간을 찾는다.

최종 정리

리스트는 단순히 여러 값을 담는 그릇이 아니라 인덱싱, 연산자, 함수, 메소드, 슬라이싱과 컴프리헨션을 결합해 데이터를 처리하는 핵심 자료구조이다. 시험에서는 컬렉션별 순서와 변경 가능성, 인덱스·슬라이스의 범위, 메소드의 동작과 반환값, 컴프리헨션 문법을 정확히 구분해야 한다.

예상문제 20선

1. 순서가 있고 생성 후 원소를 변경할 수 있는 컬렉션은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
리스트는 순서 있는 가변 시퀀스로 원소를 추가·삭제·수정할 수 있다.

2. 튜플의 특징으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
튜플은 순서 있는 불변 시퀀스로 의도하지 않은 값 변경을 방지한다.

3. 중복된 원소를 자동 제거하는 데 적합한 자료구조는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
세트는 각 원소의 고유성을 보장하므로 중복 제거와 집합 처리에 유용하다.

4. 딕셔너리의 값에 접근할 때 주로 사용하는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
딕셔너리는 키와 값의 쌍을 저장하며 키를 이용해 대응하는 값을 찾는다.

5. 빈 세트를 생성하는 올바른 표현은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
빈 중괄호는 딕셔너리를 만들기 때문에 빈 세트는 set()으로 생성한다.

6. 리스트 [1, 5, 14, 26, 31]에서 -3 인덱스의 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
음수 인덱스는 마지막이 -1이므로 -3은 뒤에서 세 번째인 14이다.

7. 두 리스트를 순서대로 연결하는 연산자는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
+ 연산자는 두 리스트의 원소를 이어 붙인 새로운 리스트를 만든다.

8. 리스트 원소 전체의 합을 반환하는 내장함수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
sum()은 수치로 구성된 리스트의 모든 원소를 더한 값을 반환한다.

9. 리스트 끝에 원소 x를 추가하는 메소드는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
append(x)는 x를 리스트의 마지막 원소로 추가한다.

10. 원소를 삭제하면서 그 값을 반환하는 메소드는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
pop(i)는 지정한 위치의 원소를 제거해 반환하며 인덱스를 생략하면 마지막 원소를 처리한다.

11. remove(x)의 동작은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
remove(x)는 값으로 검색해 첫 번째 x를 제거한다. 위치로 제거하는 pop과 구별해야 한다.

12. 리스트 [1, 5, 14, 26, 31]에서 [:3]의 결과는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
슬라이스 끝 인덱스 3은 포함하지 않으므로 0, 1, 2 위치만 선택한다.

13. 리스트를 역순으로 복사하는 슬라이스는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
간격 -1은 뒤에서 앞으로 한 칸씩 이동하여 역순 리스트를 만든다.

14. 리스트 컴프리헨션의 기본 구조는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
표현식으로 생성할 값을 정하고 for가 원본 원소를 반복한다. 뒤에 if 조건을 추가할 수 있다.

15. [h for h in values if h % 2 == 0]의 결과는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
2로 나눈 나머지가 0인 원소만 조건을 통과해 새 리스트에 포함된다.

16. 리스트 컴프리헨션의 장점으로 옳지 않은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
간단한 변환과 필터링에서는 컴프리헨션이 가독성을 높인다. 다만 지나치게 복잡한 중첩은 피해야 한다.

17. 중앙값을 구하기 전에 필요한 핵심 처리로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
중앙값은 크기순으로 정렬한 데이터의 가운데 위치 값이다.

18. 3일 이동평균을 계산하는 슬라이스로 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
시작 위치 i부터 i+3 직전까지 선택하면 연속한 세 원소가 된다.

19. sort()와 sorted()에 대한 설명으로 본문 범위에서 sort()의 핵심은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
리스트의 sort() 메소드는 해당 리스트 원소의 순서를 오름차순으로 직접 변경한다.

20. 컬렉션 선택 사례로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
자료구조의 순서, 변경 가능성, 중복 허용과 접근방식에 맞추어 선택해야 한다.

댓글