250717 [ Day 9 ] - Python (6)

TaeHyun·2025년 7월 17일

TIL

목록 보기
9/182

시작하며

오늘은 range를 제외한 다양한 이터러블 자료형과 반복문의 기초에 대해 배웠다. 이전에는 프로그래머스 같은 코딩 테스트 문제를 풀 때마다 반복문이 자주 등장했지만, 아직 배우지 않은 부분이라 항상 넘어갈 수밖에 없었다. 이제 조금만 더 배우면 드디어 반복문 문제들을 풀어낼 수 있을 것 같아 기대된다.

집합 (set)

본격적으로 반복문을 배우기에 앞서, 집합과 딕셔너리를 먼저 학습해야 했다. 다행히 집합은 학창 시절 수학 시간에 배웠던 개념과 매우 유사했다.

집합 (set)

  • 원소의 중복을 허용하지 않는 여러 데이터의 모음
  • 순서가 없는 컬렉션 자료형

set 만드는 법

  • 빈 set을 만들때에는 set( ) 함수를 사용
  • 다른 자료형의 중복을 제거하기 위해 사용하기도 함
# set 만들기

s1 = {1, 2, 3}
print(s1, type(s1))
# {1, 2, 3} <class 'set'>

s2 = {1, 1, 1, 2, 2, 2, 3, 3, 4} # 중복 X
print(s2)
# {1, 2, 3, 4}

# 빈 set 만들기
# 유의사항 : 중괄호 {} 에 원소를 넣지 않고 선언하면 빈 dict로 인식됨

s3 = {}
print(type(s3))
# <class 'dict'>

# set 함수로 생성

s4 = set()
print(type(s4))
# <class 'set'>

# set 함수의 활용 : 원소의 중복 제거

my_list = [1,1,2,2,2,2,2,3,3,4,4]
s5 = set(my_list) # set으로 변환 -> 중복 원소 제거
print(s5)
# {1, 2, 3, 4}
my_list = list(s5)
print(my_list, type(my_list))
# [1, 2, 3, 4] <class 'list'>

제한적 사항들

  • 인덱싱 제한
    s1 = {10,20,30}
    # s1[1] -> 제한
    s_list = list(s1) # 변환하는 과정에서 순서가 보장되지 않을 수 있음
    s_list[2]
  • 자료형 제한
    • 가변 자료형은 원소로 사용할 수 없음

    • Type Error 발생

      s1 = {1,2,3,[1,2,3]}
      print(s1)

set 연산

# 시작 set
a = {1,2,3}
b = {3,4,5,6}

합집합 (Union)

  • a | b
    s_union1 = a | b
    s_union2 = a.union(b)
    print("1", s_union1)
    print("2", s_union2)
    # 1 {1, 2, 3, 4, 5, 6}
    # 2 {1, 2, 3, 4, 5, 6}

교집합 (Intersection)

  • a & b
    s_inter1 = a & b
    s_inter2 = a.intersection(b)
    print("1", s_inter1)
    print("2", s_inter2)
    # 1 {3}
    # 2 {3}

차집합 (Difference)

  • a - b
    s_diff1 = a - b
    s_diff2 = b.difference(a)
    print("1", s_diff1)
    print("2", s_diff2)
    # 1 {1, 2}
    # 2 {4, 5, 6}

대칭차집합 (Symmetric Difference)

  • a ^ b
    s_symm1 = (a | b) - (a & b)
    s_symm2 = a ^ b
    s_symm3 = a.symmetric_difference(b)
    print("1", s_symm1)
    print("2", s_symm2)
    print("3", s_symm3)
    # 1 {1, 2, 4, 5, 6}
    # 2 {1, 2, 4, 5, 6}
    # 3 {1, 2, 4, 5, 6}

set 또한 앞서 배웠던 시퀀스와 같이 여러 메서드가 있다.

set 메서드

원소 추가

  • .add( )
    s1 = {1,2,3}
    
    s1.add(4)
    print(s1)
    # {1, 2, 3, 4}
  • .update( )
    s1.update([5,6,7])
    print(s1)
    # {1, 2, 3, 4, 5, 6, 7}

원소 제거

  • .remove( )
    • 존재하지 않는 원소 삭제 시도 시 Key Error 발생

      s1.remove(4)
      print(s1)
      # {1, 2, 3, 5, 6, 7}
  • .discard( )
    • 존재하지 않는 원소 삭제 시도 시 에러 발생 안함

      s1.discard(10) # discard 는 존재하지 않는 원소 삭제 시도시 에러 X
      s1.discard(7) # 동일하게 제거 가능
      print(s1)
      # {1, 2, 3, 5, 6}
  • .pop( )
    print(s1.pop()) # 임의의 값 하나 제거, 리스트와 같이 제거한 값 반환
    # 1
    print(s1)
    # {2, 3, 5, 6}

부분집합 (subset) 관련 메서드

  • 상위 집합 (Superset)
  • 부분 집합 (Subset)
a = {10, 20, 30, 40, 50}
b = {20, 30, 40}
c = {100, 200, 300, 400}

부분집합 여부 확인

print(b.issubset(a))
print(a.issubset(b))
# True
# False

상위집합 여부 확인

print(a.issuperset(b))
print(b.issuperset(a))
# True
# False

공통 원소 보유 여부 확인

print(a.isdisjoint(b))
print(a.isdisjoint(c))
print(b.isdisjoint(c))
# False
# True
# True\

이렇게 집합 파트도 마무리했다. 이제 이터러블의 마지막 자료형, 딕셔너리를 살펴볼 것이다.
딕셔너리는 데이터를 관리하는 데 아주 유용해 보여서 상당히 중요하다고 생각했다. 그래서 많은 연습과 공부가 필요하다고 느꼈다.

딕셔너리 (Dictionary)

딕셔너리 (Dictionary)

  • 키 - 값 쌍으로 묶어 데이터를 저장하는 자료형
  • 키는 유일해야 함, 값은 중복 가능
  • 변경 가능한 자료형
  • 순서가 보장되지 않았다가 파이썬 3.7 버전 이후 순서가 보장
  • 시퀀스와 경계가 흐려졌지만 시퀀스로 분류하지는 않음

딕셔너리의 장점

  • 빠른 검색 : 키를 통해 값을 매우 빠르게 찾을 수 있음
  • 명확한 구조 : 각 항목이 어떤 의미를 가지는지 명확함

dict 만들기

  • 빈 dict 만들기
    d1 = {}
    print(d1, type(d1))
    # {} <class 'dict'>
  • 기본 구조
    person = {"name" : "taehyun", "age" : 27}
    print(person)
    # {'name': 'taehyun', 'age': 27}
  • dict 함수를 사용하여 생성
    d2 = dict()
    print(d2, type(d2))
    # {} <class 'dict'>
  • key가 문자열인 경우
    movie = dict(title="interstellar", director="nolan")
    print(movie)
    # {'title': 'interstellar', 'director': 'nolan'}
    이러한 구조도 가능
  • 리스트와 튜플을 사용하여 만들기
    pairs = [("name", "taehyun"), ("age", 27), ("job", "student")] # [ ]와 ( ) 모두 사용 가능
    person2 = dict(pairs)
    print(person2)
    # {'name': 'taehyun', 'age': 27, 'job': 'student'}
  • zip 함수 사용하여 생성
    keys = ["title", "director", "year"]
    values = ["기생충", "봉준호", "2019"]
    movie2 = dict(zip(keys, values))
    print(movie2)
    # {'title': '기생충', 'director': '봉준호', 'year': '2019'}

key는 불변 자료형만 사용 가능 (리스트, 집합은 키로 사용 X)

dict 데이터 조회

key를 통한 데이터 조회

person = {"name" : "taehyun", "age" : 27, "job" : "student"}

print(person["name"])
print(person["age"])
print(person["job"])
# taehyun
# 27
# student
  • 존재하지 않는 키로 조회 시도 시 Key Error 발생

.get( ) 메서드를 통한 데이터 조회

  • 존재하지 않는 키를 입력하면 ‘None’을 반환
  • 반환하는 default 값은 지정 가능하며 기본 값은 ‘None’
print(person.get("name"))
print(person.get("city"))
print(person.get("city", "없음"))
# taehyun
# None
# 없음
  • 예시
    user_data = {
        "username" : "taehyun",
        "email" : "asd@asd.com",
        "password" : "1234"
    }
    
    key = input("조회할 정보를 입력하세요(username, email, password)")
    result = user_data.get(key, "존재하지 않는 데이터입니다.")
    print(result)

키와 값이라는 새로운 구조가 나와 처음에는 낯설었지만, 계속 실습하며 사용해보니 어느 정도 익숙해진 느낌이다.

데이터 추가 및 수정

기본적인 추가 & 수정 방법

  • 없던 키 데이터는 추가, 존재하던 키 데이터는 수정
user_data = {
    "username" : "taehyun"
}

user_data["age"] = 27
print(user_data)
# {'username': 'taehyun', 'age': 27}

user_data["age"] = 26
print(user_data)
# {'username': 'taehyun', 'age': 26}

.update( ) 메서드 활용

  • .update({”키” : “값”, “키2”, “값2”}) 으로 사용
movie_data = {
    "title" : "Superman",
    "director" : "Gunn"
}

movie_data.update({
    "year" : 2025,
})
print(movie_data)
# {'title': 'Superman', 'director': 'Gunn', 'year': 2025}
  • 키가 문자열인 경우
movie_data.update(actor="Hoult")
print(movie_data)
# {'title': 'Superman', 'director': 'Gunn', 'year': 2025, 'actor': 'Hoult'}

이러한 구조로 사용 가능

  • 다른 딕셔너리를 사용하여 추가 및 수정 가능
extra_data = {"rating" : "4.0 / 5.0", "actor" : "Nicholas"}
movie_data.update(extra_data)
print(movie_data)
# {'title': 'Superman', 'director': 'Gunn', 'year': 2025, 'actor': 'Nicholas', 'rating': '4.0 / 5.0'}

.setdefault( ) 메서드 활용

  • 이미 존재하는 값은 수정 X, 존재하지 않는 키는 추가
movie_data.setdefault("제작사", "DC_스튜디오")
movie_data.setdefault("year", "알 수 없음")
print(movie_data)
# {'title': 'Superman', 'director': 'Gunn', 'year': 2025, 'actor': 'Nicholas', 'rating': '4.0 / 5.0', '제작사': 'DC_스튜디오'}

데이터 삭제

del 활용

del movie_data["actor"]
print(movie_data)
# {'title': 'Superman', 'director': 'Gunn', 'year': 2025, 'rating': '4.0 / 5.0'}

.pop( ) 메서드 활용

rating = movie_data.pop("rating")
print(movie_data, rating, sep=" /// ")
# {'title': 'Superman', 'director': 'Gunn', 'year': 2025} /// 4.0 / 5.0
  • 삭제한 데이터 반환
  • 존재하지 않는 키를 삭제하면 Key Error 발생
  • 존재하지 않는 키와 두번째 인자에 값을 추가하면 출력 가능
user_data = {"name" : "taehyun", "age" : 27}

# print(user_data.pop("city")) # Key Error
print(user_data.pop("city", "해당 키 없음"))

print(user_data)
# 해당 키 없음
# {'name': 'taehyun', 'age': 27}
  • .popitem() 을 사용하면 가장 마지막 요소 제거 : 키, 값 쌍으로 반환
year = movie_data.popitem()
print(movie_data, year, sep=" /// ")
# {'title': 'Superman', 'director': 'Gunn'} /// ('year', 2025)

.clear( ) 메서드 활용

movie_data.clear()
print(movie_data)
# {}

dict 삭제하기

  • Name Error 발생
del movie_data
print(movie_data)

딕셔너리 메서드

keys

  • 모든 키를 반환
  • 리스트로 변환하고 싶다면 list( ) 함수 사용
user_data = {
    "username" : "taehyun",
    "email" : "asd@asd.com"
}

print("키", list(user_data.keys())) # 리스트로 변환해서 출력
# 키 ['username', 'email']

values

  • 모든 값을 반환
print("값", list(user_data.values())) # 리스트로 변환해서 출력
# 값 ['taehyun', 'asd@asd.com']

items

  • 모든 키, 값 쌍을 반환
print("쌍", list(user_data.items())) # 리스트로 변환해서 출력
# 쌍 [('username', 'taehyun'), ('email', 'asd@asd.com')]

다른 자료형에서 많이 보던 메서드와 함수들이 많아서 나름 쉽게 익힐 수 있었다.
이렇게 길고 길었던 이터러블 파트가 일단 끝이 난 것 같다. 이제 드디어 반복문에 대한 내용을 배우게 되었다.

for 문

반복 (iteration) 의 정의

  • 동일한 작업 (코드 블록)을 여러 번 실행하는 구조적 프로그래밍 기법
    - Python은 for 문과 while 문을 사용하여 반복문을 구현

반복문 사용의 목적

  • 동일한 작업의 반복 실행
  • 가독성과 유지보수성 향상
  • 자동화의 대량 처리

for 문

이터러블의 요소를 하나씩 꺼내서 실행 블록에 전달하는 반복문

for 반복변수 in 이터러블:

	반복할 코드

이러한 구조를 이루고 있음

for 반복변수 in ["가", "나", "다", "라"]:
    print(반복변수)
# 가
# 나
# 다
# 라

  • 문자열 사용
my_str = "Coding"

for text in my_str:
    print(text)
# C
# o
# d
# i
# n
# g

  • 리스트 or 튜플 사용
fruits = ["사과", "배", "수박", "참외", "포도"]

for fruit in fruits:
    print(fruit)
# 사과
# 배
# 수박
# 참외
# 포도

  • 언패킹 사용
좌표 = [(1,2), (10,15), (-6,8)]

for x, y in 좌표:
    print(f"x 좌표: {x}, y 좌표: {y}")
# x 좌표: 1, y 좌표: 2
# x 좌표: 10, y 좌표: 15
# x 좌표: -6, y 좌표: 8

마치며

오늘은 반복문 첫날이라 기초적인 내용을 간단히 다루고 끝났다. 아마도 내일부터 반복문에 대한 많은 내용을 배울 수 있을 것 같다.

점점 배우는 내용들이 많아지니 공부한 내용을 정리하고 블로깅을 하면 2시간 정도는 그냥 흐르는 것 같다....
요즘들어 하루가 너무 짧다는 느낌이 들기 시작했다.

NOTION

MY NOTION (Python. Set)
MY NOTION (Python. Dictionary)

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글