오늘은 range를 제외한 다양한 이터러블 자료형과 반복문의 기초에 대해 배웠다. 이전에는 프로그래머스 같은 코딩 테스트 문제를 풀 때마다 반복문이 자주 등장했지만, 아직 배우지 않은 부분이라 항상 넘어갈 수밖에 없었다. 이제 조금만 더 배우면 드디어 반복문 문제들을 풀어낼 수 있을 것 같아 기대된다.
본격적으로 반복문을 배우기에 앞서, 집합과 딕셔너리를 먼저 학습해야 했다. 다행히 집합은 학창 시절 수학 시간에 배웠던 개념과 매우 유사했다.
# 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
a = {1,2,3}
b = {3,4,5,6}
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} s_inter1 = a & b
s_inter2 = a.intersection(b)
print("1", s_inter1)
print("2", s_inter2)
# 1 {3}
# 2 {3} s_diff1 = a - b
s_diff2 = b.difference(a)
print("1", s_diff1)
print("2", s_diff2)
# 1 {1, 2}
# 2 {4, 5, 6} 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 또한 앞서 배웠던 시퀀스와 같이 여러 메서드가 있다.
s1 = {1,2,3}
s1.add(4)
print(s1)
# {1, 2, 3, 4}s1.update([5,6,7])
print(s1)
# {1, 2, 3, 4, 5, 6, 7} 존재하지 않는 원소 삭제 시도 시 Key Error 발생
s1.remove(4)
print(s1)
# {1, 2, 3, 5, 6, 7}
존재하지 않는 원소 삭제 시도 시 에러 발생 안함
s1.discard(10) # discard 는 존재하지 않는 원소 삭제 시도시 에러 X
s1.discard(7) # 동일하게 제거 가능
print(s1)
# {1, 2, 3, 5, 6}
print(s1.pop()) # 임의의 값 하나 제거, 리스트와 같이 제거한 값 반환
# 1
print(s1)
# {2, 3, 5, 6} 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\
이렇게 집합 파트도 마무리했다. 이제 이터러블의 마지막 자료형, 딕셔너리를 살펴볼 것이다.
딕셔너리는 데이터를 관리하는 데 아주 유용해 보여서 상당히 중요하다고 생각했다. 그래서 많은 연습과 공부가 필요하다고 느꼈다.
d1 = {}
print(d1, type(d1))
# {} <class 'dict'>person = {"name" : "taehyun", "age" : 27}
print(person)
# {'name': 'taehyun', 'age': 27}d2 = dict()
print(d2, type(d2))
# {} <class 'dict'>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'}keys = ["title", "director", "year"]
values = ["기생충", "봉준호", "2019"]
movie2 = dict(zip(keys, values))
print(movie2)
# {'title': '기생충', 'director': '봉준호', 'year': '2019'}key는 불변 자료형만 사용 가능 (리스트, 집합은 키로 사용 X)
person = {"name" : "taehyun", "age" : 27, "job" : "student"}
print(person["name"])
print(person["age"])
print(person["job"])
# taehyun
# 27
# student
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({”키” : “값”, “키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'}
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 movie_data["actor"]
print(movie_data)
# {'title': 'Superman', 'director': 'Gunn', 'year': 2025, 'rating': '4.0 / 5.0'}
rating = movie_data.pop("rating")
print(movie_data, rating, sep=" /// ")
# {'title': 'Superman', 'director': 'Gunn', 'year': 2025} /// 4.0 / 5.0
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)
movie_data.clear()
print(movie_data)
# {}
del movie_data
print(movie_data)
user_data = {
"username" : "taehyun",
"email" : "asd@asd.com"
}
print("키", list(user_data.keys())) # 리스트로 변환해서 출력
# 키 ['username', 'email']
print("값", list(user_data.values())) # 리스트로 변환해서 출력
# 값 ['taehyun', 'asd@asd.com']
print("쌍", list(user_data.items())) # 리스트로 변환해서 출력
# 쌍 [('username', 'taehyun'), ('email', 'asd@asd.com')]
다른 자료형에서 많이 보던 메서드와 함수들이 많아서 나름 쉽게 익힐 수 있었다.
이렇게 길고 길었던 이터러블 파트가 일단 끝이 난 것 같다. 이제 드디어 반복문에 대한 내용을 배우게 되었다.
이터러블의 요소를 하나씩 꺼내서 실행 블록에 전달하는 반복문
for 반복변수 in 이터러블:
반복할 코드
이러한 구조를 이루고 있음
for 반복변수 in ["가", "나", "다", "라"]:
print(반복변수)
# 가
# 나
# 다
# 라
my_str = "Coding"
for text in my_str:
print(text)
# C
# o
# d
# i
# n
# g
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시간 정도는 그냥 흐르는 것 같다....
요즘들어 하루가 너무 짧다는 느낌이 들기 시작했다.