배꼽파지 않도록 잘 개발해요

방송대 오픈소스기반데이터분석 - 2강. 데이터 분석을 위한 파이썬 프로그래밍 1 본문

방송대 컴퓨터과학과/오픈소스기반데이터분석

방송대 오픈소스기반데이터분석 - 2강. 데이터 분석을 위한 파이썬 프로그래밍 1

꼽파 2025. 9. 18. 13:50

1. 리스트와 딕셔너리

2. 데이터 입출력


1. 리스트와 딕셔너리

1) 리스트 슬라이싱

  • 리스트의 특정 구간을 추출하거나 역순으로 가져올 수 있음.
  • 부분 리스트 추출: [시작:끝:간격]
  • 끝 인덱스는 포함하지 않음
  • 음수 인덱스 사용 가능 (역순 추출)
  • 다차원 리스트에도 적용 가능
nums = [10, 20, 30, 40, 50, 60]

print(nums[1:4])     # [20, 30, 40] → 1~3번 인덱스
print(nums[:3])      # [10, 20, 30] → 처음부터 3개
print(nums[::2])     # [10, 30, 50] → 2칸 간격
print(nums[::-1])    # [60, 50, 40, 30, 20, 10] → 역순


2) 리스트 컴프리헨션

  • 반복문과 조건문을 한 줄에 표현
  • 기존 리스트 변형, 필터링에 자주 사용
  • 코드 간결 + 실행 속도 빠름
# 0~4 생성
nums = [i for i in range(5)]
print(nums)   # [0, 1, 2, 3, 4]

# 짝수만 추출
evens = [n for n in range(10) if n % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

# 제곱 리스트
squares = [n**2 for n in range(6)]
print(squares)  # [0, 1, 4, 9, 16, 25]

# 중첩 반복문
fruits = ["사과", "바나나"]
forms = ["주스", "잼"]
pairs = [(f, x) for f in fruits for x in forms]
print(pairs)  # [('사과','주스'), ('사과','잼'), ('바나나','주스'), ('바나나','잼')]

 

 

3) 딕셔너리 컴프리헨션

  • {키: 값 for 변수 in 반복객체}
  • 조건문으로 특정 원소만 추출 가능
  • 매핑/변환 시 간결하고 유용 
# 숫자: 제곱
squares = {n: n**2 for n in range(5)}
print(squares)  # {0:0, 1:1, 2:4, 3:9, 4:16}

# 짝수만 필터링
even_squares = {n: n**2 for n in range(10) if n % 2 == 0}
print(even_squares)  # {0:0, 2:4, 4:16, 6:36, 8:64}

# 문자열 길이
words = ["apple", "banana", "kiwi"]
lengths = {w: len(w) for w in words}
print(lengths)  # {'apple': 5, 'banana': 6, 'kiwi': 4}

2. 데이터 입출력

1) 문자열 형식 지정

  • 출력 시 변수 값 삽입
  • 세 가지 방식 존재:
  1. % 연산자 (C 스타일, 구식)
  2. str.format() (유연, 다양한 기능)
  3. f-string (가장 간단, 추천)

% 연산자

% 연산자의 형식 지정자 종류:

  • %d, %i → 정수
  • %o, %x, %X → 8진수/16진수
  • %f, %.2f → 실수(소수점 자리수 지정)
  • %c → 문자
  • %s → 문자열
  • %% → % 자체 출력
# 8진수 / 16진수
num = 255
print("8진수: %o, 16진수: %x, 대문자 16진수: %X" % (num, num, num))
# 8진수: 377, 16진수: ff, 대문자 16진수: FF

# %c (아스키코드 → 문자)
print("%c" % 65)   # A

 

str.format() 

  • 다양한 출력 옵션 지원: 정렬, 패딩, 소수점, 천 단위 구분자
name, age, salary, tax_rate = "홍길동", 30, 3500000, 0.1

print("직원정보: 이름: {0} 나이: {1}".format(name, age))
# 직원정보: 이름: 홍길동 나이: 30

print("급여: {0:,}원, 세금: {1:.1%}".format(salary, tax_rate))
# 급여: 3,500,000원, 세금: 10.0%

 

f-string 

 

  • {변수:,} → 천 단위 구분자, {:.1%} → 백분율 표현
  • 표현식 직접 삽입 가능

 

salary, tax_rate = 3500000, 0.1
name, age = "홍길동", 30

print(f"이름: {name}, 나이: {age}, 세후 월급: {int(salary*(1-tax_rate)):,}원")
# 이름: 홍길동, 나이: 30, 세후 월급: 3,150,000원

 

전체 비교

name, age, pi = "홍길동", 30, 3.14159

# (1) % 연산자
print("이름: %s, 나이: %d, 원주율: %.2f" % (name, age, pi))
# 이름: 홍길동, 나이: 30, 원주율: 3.14

# (2) str.format()
print("이름: {}, 나이: {}, 원주율: {:.2f}".format(name, age, pi))
print("이름: {n}, 나이: {a}".format(n=name, a=age))
# 이름: 홍길동, 나이: 30, 원주율: 3.14

# (3) f-string (Python 3.6+)
print(f"이름: {name}, 나이: {age}, 원주율: {pi:.2f}")
# 이름: 홍길동, 나이: 30, 원주율: 3.14

# 추가: 수식/함수 사용 가능
print(f"내년 나이: {age+1}")         # 내년 나이: 31
print(f"이름 대문자: {name.upper()}") # 이름 대문자: 홍길동


2) 컨텍스트 관리 (with문)

  • 컨텍스트 관리의 목적: 리소스 누수 방지 (파일, DB, 소켓)
  • with 블록을 벗어나면 자동으로 자원이 해제됨.
  • close() 호출 필요 없음 → 코드 안정성 ↑
  • 여러 자원 동시에 관리 가능
# (1) 일반 방식
f = open("test.txt", "w")
f.write("Hello\n")
f.close()

# (2) with문 사용 (자동 close)
with open("test.txt", "w") as f:
    f.write("Hello, Python!\n")

# (3) 여러 파일 동시에 관리
with open("input.txt", "r") as fin, open("output.txt", "w") as fout:
    for line in fin:
        fout.write(line.upper())

# (4) 예외 발생해도 안전
try:
    with open("data.txt", "r") as f:
        for line in f:
            print(line.strip())
except Exception as e:
    print("에러 발생:", e)

요약

1. 리스트와 딕셔너리

  • 슬라이싱: [시작:끝:간격], 음수 가능, 역순 가능
  • 리스트 컴프리헨션: [표현식 for 변수 in 객체 if 조건] → 간결하고 빠름
  • 딕셔너리 컴프리헨션: {키: 값 for 변수 in 객체 if 조건} → 매핑/필터링 편리

2. 데이터 입출력

  • 문자열 포맷팅
    • % 연산자: 기본 C 스타일 (%d, %f, %s, %x, %c, %% 등).
    • str.format(): 다양한 포맷, 유연. 정렬·패딩·천 단위 구분자 지원
    • f-string: 가장 간단, 추천 방식
  • 컨텍스트 관리
    • with문으로 자원 자동 해제 → 메모리 누수 방지, 코드 안정성↑
728x90