오픈소스기반데이터분석 2강 - 데이터 분석을 위한 파이썬 프로그래밍 (1)
데이터 분석에서는 파이썬 문법을 아는 것에 더해 데이터를 간결하고 정확하게 추출·변환·표현하는 능력이 필요하다. 이 글에서는 시퀀스 슬라이싱과 컴프리헨션, C 스타일·str.format()·f-문자열 포맷팅, with문을 이용한 안전한 리소스 관리까지 2강의 핵심을 예제 중심으로 정리한다.
1. 데이터 분석과 효율적인 파이썬 표현
강의록에서는 2021년 Anaconda Inc.가 데이터 과학자 3,104명을 조사한 결과, 63%가 파이썬을 항상 또는 자주 사용했다고 소개한다. 하지만 데이터 분석에는 단순히 문법을 작성하는 능력 이상의 역량이 필요하다. 데이터를 효과적으로 다루고 변환할 자료구조를 선택하고, 처리 과정을 오류 없이 간결하게 표현해야 하기 때문이다.
특히 리스트와 딕셔너리 같은 시퀀스·컨테이너 구조를 깊이 이해하면 데이터의 일부를 추출하고, 조건에 맞는 새 값을 만들고, 결과를 읽기 좋은 문자열로 바꾸는 과정을 효율적으로 작성할 수 있다.
데이터 추출에는 슬라이싱, 반복 변환에는 컴프리헨션, 결과 표현에는 문자열 포맷팅, 외부 자원 관리에는 컨텍스트 관리가 사용된다.
2. 리스트 슬라이싱
2.1 기본 문법과 인덱스 범위
리스트 슬라이싱은 대상 리스트의 일부분을 새 리스트로 만들거나 특정 범위를 수정하는 문법이다. 기본 형식은 리스트[시작 인덱스:끝 인덱스:간격]이다. 시작 인덱스는 포함하지만 끝 인덱스는 포함하지 않는다.
numbers = [10, 20, 30, 40, 50, 60, 70]
subset1 = numbers[0:3]
print(subset1) # [10, 20, 30]
numbers[0:3]은 인덱스 0부터 시작해 3 직전인 인덱스 2까지 선택한다. 시작값이 0이면 생략하여 numbers[:3]으로 쓸 수 있다.
2.2 음수 인덱스와 생략
파이썬의 음수 인덱스는 리스트의 뒤에서부터 원소를 센다. 마지막 원소는 -1, 그 앞은 -2다. 끝 인덱스를 생략하면 리스트 끝까지 선택한다.
numbers = [10, 20, 30, 40, 50, 60, 70]
subset2 = numbers[-3:]
print(subset2) # [50, 60, 70]
인덱스 -3은 값 50을 가리키므로 numbers[-3:]은 마지막 세 원소를 얻는다. 시작 인덱스를 생략하면 처음부터, 시작과 끝을 모두 생략하면 전체 범위를 뜻한다.
2.3 간격과 역순
세 번째 항목인 간격은 원소를 몇 칸씩 건너 선택할지를 정한다. 양수 2는 앞에서부터 두 칸 간격으로 선택하고, -1은 진행 방향을 반대로 바꾸어 리스트를 역순으로 만든다.
numbers = [10, 20, 30, 40, 50, 60, 70]
list1 = numbers[::2]
print(list1) # [10, 30, 50, 70]
list2 = numbers[::-1]
print(list2) # [70, 60, 50, 40, 30, 20, 10]
| 슬라이스 | 의미 | 결과 |
|---|---|---|
numbers[:3] | 처음부터 인덱스 3 직전까지 | [10, 20, 30] |
numbers[-3:] | 뒤에서 세 번째 원소부터 끝까지 | [50, 60, 70] |
numbers[::2] | 전체에서 두 칸 간격 | [10, 30, 50, 70] |
numbers[::-1] | 전체를 역방향 한 칸 간격 | [70, 60, 50, 40, 30, 20, 10] |
3. 리스트와 딕셔너리 컴프리헨션
3.1 리스트 컴프리헨션의 구조
리스트 컴프리헨션은 반복 가능한 객체를 순회하며 새 리스트를 간결하게 생성·조작하는 표현식이다. 반복 가능한 객체에는 리스트, 튜플, 딕셔너리, 문자열, 집합, range 객체 등이 있다.
[표현식 for 변수 in 반복가능한_객체]
[표현식 for 변수 in 반복가능한_객체 if 조건]
일반 반복문에서 빈 리스트를 만들고 append()로 값을 추가하는 과정을 한 줄로 나타낼 수 있다.
# 일반 반복문
numbers = []
for i in range(5):
numbers.append(i)
# 같은 결과의 리스트 컴프리헨션
numbers = [i for i in range(5)]
print(numbers) # [0, 1, 2, 3, 4]
3.2 원소 조작과 조건 적용
맨 앞의 표현식은 새 리스트에 들어갈 값을 만든다. 뒤의 if 조건은 어떤 원소를 결과에 포함할지를 결정한다.
numbers = [1, 2, 3, 4, 5]
squares = [num ** 2 for num in numbers]
print(squares) # [1, 4, 9, 16, 25]
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [num for num in numbers if num % 2 == 0]
print(even_numbers) # [2, 4, 6, 8, 10]
첫 예는 모든 원소를 제곱해 변환하고, 두 번째 예는 짝수 조건을 만족하는 값만 골라 새 리스트에 담는다. 컴프리헨션은 결과를 만드는 표현식이므로 단순 반복문보다 데이터 변환 의도가 또렷하다.
3.3 딕셔너리 컴프리헨션
딕셔너리 컴프리헨션은 대괄호 대신 중괄호를 쓰고 결과를 키: 값표현식으로 작성한다. 새 딕셔너리를 만들거나 기존 딕셔너리의 키·값을 순회해 변환할 수 있다.
{키_표현식: 값_표현식 for 변수 in 반복가능한_객체}
{키_표현식: 값_표현식
for 키변수, 값변수 in 딕셔너리.items()}
# 반복문으로 생성
squares = {}
for i in range(5):
squares[i] = i ** 2
# 딕셔너리 컴프리헨션으로 생성
squares = {i: i ** 2 for i in range(5)}
print(squares) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
[값 표현식 ...]으로 원소 목록을 만들고, 딕셔너리 컴프리헨션은 {키: 값 표현식 ...}으로 키-값 쌍을 만든다.4. 문자열 형식 지정과 C 스타일 포맷팅
4.1 문자열 포맷팅의 필요성
데이터 분석에서는 변수 값을 설명 문장에 넣거나 숫자를 일정 자릿수와 단위로 표시하는 일이 자주 발생한다. 문자열 포맷팅은 값과 출력 형식을 결합해 읽기 좋은 문자열을 만드는 기능이다. 강의에서는 C 스타일의 % 연산자, str.format(), f-문자열을 비교한다.
4.2 C 스타일의 기본 형식
C 스타일 포맷팅은 C 언어의 printf()와 비슷하다. 형식 지정자가 포함된 문자열 뒤에 % 연산자를 두고 값 또는 값의 튜플을 전달한다.
"형식 지정자를 포함한 문자열" % (변수_목록)
item = "프린터"
price = 360000
print("상품명: %s, 가격: %d" % (item, price))
| 형식 지정자 | 의미 |
|---|---|
%d, %i | 10진 정수 출력 |
%o | 8진수 출력 |
%x, %X | 소문자 또는 대문자 16진수 출력 |
%f | 소수점이 있는 실수 출력 |
%.nf | 소수점 이하 n자리까지 출력 |
%c | 단일 문자 또는 정수에 대응하는 문자 출력 |
%s | 문자열 출력 |
%% | % 문자 자체 출력 |
C 경험이 있는 학습자에게 익숙하고 두 언어를 함께 쓰는 환경에서 스타일을 맞추기 쉽다. 반면 변수가 많아지면 순서와 개수를 맞추기 복잡하고, 불일치 시 오류가 생기며, 중첩된 리스트·딕셔너리 구조를 직접 활용하기 어렵다는 단점이 있다.
5. str.format() 메서드
5.1 자리 표시자와 인자
str.format()은 중괄호로 표시한 자리 표시자에 값을 삽입한다. % 방식보다 가독성이 높고 인덱스나 이름으로 값을 선택할 수 있어 유연하다.
"문자열 {위치 또는 이름}".format(인자)
item = "프린터"
price = 360000
print("상품명: {}, 가격: {}".format(item, price))
빈 중괄호는 인자를 앞에서부터 사용한다. 숫자 인덱스를 쓰면 같은 인자를 반복해서 참조할 수 있고, 키워드 이름을 쓰면 각 값의 의미를 드러낼 수 있다.
5.2 인덱스·키워드와 출력 형식
basic_format = \
'이름: {}, 나이: {}, 월급: {}원'.format(name, age, salary)
index_format = \
'직원 {0}의 나이는 {1}세이고, {0}의 세후 월급은 {2}원입니다.' \
.format(name, age, int(salary * (1 - tax_rate)))
keyword_format = \
('직원정보: 이름: {employee} 나이: {years}세 '
'월급: {income:,}원 세금: {tax:.1%} '
'실수령액: {net_income:,}원').format(
employee=name,
years=age,
income=salary,
tax=tax_rate,
net_income=int(salary * (1 - tax_rate)))
{income:,}의 쉼표는 천 단위 구분자를 넣고, {tax:.1%}는 비율을 백분율로 바꾸어 소수점 한 자리까지 표시한다. 정렬, 패딩, 소수점 자릿수 등도 형식 지정자로 조절할 수 있다.
6. f-문자열 포맷팅
6.1 기본 문법
f-문자열은 파이썬 3.6부터 도입된 형식 지정 방식이다. 문자열 앞에 f 또는 F 접두사를 붙이고 중괄호 안에 변수나 표현식을 직접 작성한다.
f"문자열 {표현식}"
name = "홍길동"
age = 30
print(f"이름: {name}, 나이: {age}")
값을 삽입할 위치와 표현식이 같은 곳에 있어 가장 직관적이며, 코드 길이를 줄이고 가독성을 높인다. 중괄호 안에서는 단순 변수뿐 아니라 산술식과 함수 호출도 평가할 수 있다.
6.2 형식 지정 활용
basic_format = \
f'이름: {name}, 나이: {age}, 월급: {salary}원'
index_format = \
f'직원 {name}의 나이는 {age}세이고, ' \
f'{name}의 세후 월급은 {int(salary * (1 - tax_rate))}원입니다.'
keyword_format = \
f'직원정보: 이름: {name} 나이: {age}세 ' \
f'월급: {salary:,}원 세금: {tax_rate:.1%} ' \
f'실수령액: {int(salary * (1 - tax_rate)):,}원'
| 방식 | 표현 | 강의에서 강조한 특징 |
|---|---|---|
| C 스타일 | "%s %d" % (값1, 값2) | 간단한 형식에 유용하지만 값이 많으면 순서 관리가 어렵다. |
| str.format() | "{}".format(값) | 위치·이름·형식 지정이 유연하지만 복잡하면 장황하다. |
| f-문자열 | f"{표현식}" | 변수와 표현식을 직접 넣는 가장 직관적인 방식이다. |
7. 컨텍스트 관리와 with문
7.1 리소스의 획득과 해제
리소스는 파일, 데이터베이스 연결, 네트워크 소켓처럼 획득해 사용한 뒤 명시적으로 폐기해야 하는 자원이다. 사용 후 해제하지 않으면 메모리 누수나 데이터 손상 같은 문제가 발생할 수 있다.
file = open("output.txt", "w")
file.write("Hello, world!\n")
file.close()
위 코드는 파일을 열고 쓰고 닫는 기본 흐름이다. 하지만 쓰기 도중 예외가 발생하면 close()에 도달하지 못할 수 있다는 문제가 있다.
7.2 컨텍스트 관리
컨텍스트 관리는 자원을 효율적이고 안전하게 사용하도록 획득과 해제를 자동으로 처리하는 메커니즘이다. with 키워드로 컨텍스트를 만들면 블록을 정상적으로 마치거나 예외로 빠져나가더라도 자원이 적절히 해제된다.
with open("output.txt", "w") as file:
file.write("Hello, world!\n")
open()이 만든 파일 객체가 file에 연결되고, 들여쓰기한 블록 안에서 사용된다. 블록을 벗어나면 파일이 자동으로 닫히므로 별도의 file.close()가 필요하지 않다.
8. 핵심 개념 정리
- 슬라이싱은
[시작:끝:간격]으로 시퀀스 일부를 추출하며 끝 인덱스는 포함하지 않는다. - 음수 인덱스는 뒤에서부터 세고,
[::-1]은 리스트를 역순으로 복사한다. - 리스트 컴프리헨션은 표현식·반복·조건을 한 구조에 담아 새 리스트를 간결하게 만든다.
- 딕셔너리 컴프리헨션은 중괄호와
키: 값표현으로 키-값 데이터를 생성한다. - C 스타일 포맷팅은 간단한 출력에 유용하지만 변수의 개수와 순서가 늘면 복잡해진다.
str.format()은 중괄호 자리 표시자에 위치·키워드·형식 지정자를 사용할 수 있다.- f-문자열은 문자열 안에 변수와 표현식을 직접 작성하는 가장 직관적인 포맷팅 방식이다.
- 컨텍스트 관리는 리소스의 획득과 해제를 자동화하며 with문은 예외 발생 시에도 안전한 반환을 보장한다.
데이터 분석 코드는 값을 정확히 계산하는 것뿐 아니라 추출·변환·표현·자원 관리의 의도를 간결하게 드러내야 한다. 슬라이싱과 컴프리헨션, f-문자열, with문은 이러한 파이썬다운 표현을 구성하는 핵심 도구다.
9. 예상문제 20선
1. 리스트 슬라이싱의 일반적인 문법 형식은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
슬라이싱은 대괄호 안에 시작 인덱스, 끝 인덱스, 간격을 콜론으로 구분해 작성한다.
2. numbers = [10, 20, 30, 40, 50]일 때 numbers[:3]의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
시작 인덱스를 생략하면 처음부터 선택하고 끝 인덱스 3은 포함하지 않으므로 인덱스 0, 1, 2가 선택된다.
3. 리스트의 마지막 세 원소를 슬라이싱하는 표현은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
음수 인덱스 -3은 뒤에서 세 번째 원소를 가리키고 끝을 생략하면 마지막 원소까지 선택한다.
4. 리스트의 모든 원소를 역순으로 얻는 표현은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
시작과 끝을 생략하고 간격을 -1로 지정하면 전체 범위를 뒤에서 앞으로 한 칸씩 순회한다.
5. 리스트 컴프리헨션의 기본 문법으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
새 리스트에 들어갈 표현식을 먼저 쓰고 for 절에서 반복 변수와 반복 가능한 객체를 지정한다.
6. [num ** 2 for num in [1, 2, 3]]의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
각 원소에 거듭제곱 연산자 ** 2를 적용하므로 1, 4, 9가 새 리스트에 들어간다.
7. 1부터 10까지의 값에서 짝수만 고르는 리스트 컴프리헨션은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
for 절 뒤의 if 조건이 true인 원소만 결과에 포함되며 나머지가 0인 값이 짝수다.
8. {i: i ** 2 for i in range(3)}의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
range(3)은 0, 1, 2를 만들며 각 값이 키가 되고 그 제곱이 값인 딕셔너리가 생성된다.
9. C 스타일 포맷팅에서 문자열을 출력하는 형식 지정자는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
%s는 문자열을 출력한다. %d는 정수, %x는 16진수, %f는 실수 출력에 사용한다.
10. C 스타일 포맷팅에서 % 문자 자체를 출력하는 형식은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
C 스타일 형식 문자열 안에서 퍼센트 기호 자체는 두 개를 연속한 %%로 표현한다.
11. C 스타일 포맷팅의 단점으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
형식 지정자와 값의 순서·개수가 일치해야 하므로 항목이 많고 구조가 복잡할수록 코드가 읽기 어려워진다.
12. str.format()에서 같은 첫 번째 인자를 두 번 참조하는 자리 표시자는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
str.format의 중괄호 안에 인덱스 0을 쓰면 format에 전달한 첫 번째 인자를 필요한 위치마다 반복 참조할 수 있다.
13. {salary:,} 형식 지정의 효과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
콜론 뒤의 쉼표 형식은 360000을 360,000처럼 천 단위로 구분해 읽기 쉽게 출력한다.
14. {tax_rate:.1%}가 나타내는 형식은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
.1은 소수점 한 자리, %는 값을 백분율 형식으로 표시하라는 뜻이다.
15. f-문자열에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
파이썬 3.6부터 도입된 f-문자열은 접두사와 중괄호를 이용해 변수나 표현식을 직접 삽입한다.
16. f-문자열의 장점으로 가장 알맞은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
값과 출력 위치가 같은 곳에 있어 마지막 인자 목록을 대조할 필요가 적고 가독성이 높다.
17. 컨텍스트 관리가 필요한 리소스의 예로 적절하지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
파일·연결·소켓은 사용 뒤 해제가 필요한 외부 자원이지만 단순 정수 값은 명시적으로 닫을 리소스가 아니다.
18. 파일을 사용한 뒤 명시적으로 닫지 않았을 때 발생할 수 있는 문제는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
사용한 외부 자원을 적절히 해제하지 않으면 자원이 계속 점유되거나 버퍼의 데이터가 안전하게 반영되지 않을 수 있다.
19. with문을 사용한 파일 처리의 장점은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
컨텍스트 관리자는 with 블록의 종료 시점에 파일을 자동으로 닫아 close 호출 누락을 예방한다.
20. 다음 중 가장 안전한 파일 쓰기 코드의 구조는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
with문은 파일 획득과 해제를 컨텍스트 관리에 맡겨 정상 종료와 예외 발생 모두에서 안전한 반환을 돕는다.
댓글
댓글 쓰기