카테고리도, 썸네일도 작업해야하는데 내용을 빠르게 채우고 넘길 생각과, 작업 환경을 바꾸면서 자료를 전부 넘기지 못해 일정한 퀄리티를 유지 못하고 있다. 그래도 복습, 기록을 뭐라도 해둬야 미래의 내가 덜 고생하니 힘내서 바로 옮겨 쓰자...
7. dict
하나의 키(key), 값(value)을 쌍으로 묶어 데이터를 저장하는 자료형
키는 유일해야 함. (a는 b다 같은 느낌으로... 주어같은 위치일까.) 값은 중복에 수정도 가능하다.
파이썬이 버전 업데이트하면서 순서 보장이 가능해졌고 변경( Mutable )가능한 자료형이다.
이것을 쓰는 건 키를 통해 값을 빠르게 찾고(해시 기반), 키 설정 통해 명확한 구조로 정보를 짤 수 있어서다.
확장성과 유연성도 좋아 자료 구조 표현에 잘 쓰이고 JSON과 호환된다.
JSON도 데이터를 키 값 쌍의 구조로 표현하는 경량 데이터 교환 형식이며, 속성- 값으로 구성된 데이터 포맷이라서.
dict 만들기
d1 = {} #빈 dict
print(d1, type(d1)) #{}, <class 'dict'>
앞에서 set 얘기할 때 set은 빈 요소로 못 만든다는 게, 정말로 빈 딕셔너리가 저 구조라서 그런거다.
dict 함수로 생성
d2 = dict()
print(d2, type(d2)) #{} <class 'dict'>
딕셔너리 만들 때, 키 부분은 문자열일 필요는 없지만, 일반적으로 '문자열'로 지정하고 불변 자료형만 사용할 수 있다.
(문자열, 숫자, 튜플.../ 가변 자료형인 리스트는 키로 지정 못한다는 뜻)
dict() 함수로 생성하는 건 함수 호출 방식을 쓰고, 키는 문자열에 변수 이름처럼 쓸 수 있는 형식이여야 한다.
키가 문자열일 때 가능한 수
movie = dict(title = "int", director= "nolan")
print(movie, movie["director"])
#{'title': 'int', 'director': 'nolan'} nolan
{movie 출력 값} movie ["director"]< 키 지정. 이다.
리스트나 튜플로 만들기
pairs = [("name", "luna"),("age",10),("job","dev")] <리스트 안에 튜플 요소 넣은거다. (키 지정때 리스트를 못 쓰니까)
person2 = dict(pairs)
print(person2)
#{'name': 'luna', 'age': 10, 'job': 'dev'}
키, 밸류 형태의 쌍을 요소로 가지는 리스트, 튜플 통해 딕셔너리가 가능하고
CSV 데이터 파싱 또는 키-값 리스트를 가공할 때 쓰는 거 같다.
zip 함수 활용
key = ["title", "director","year"]
valus = ["기생충", "봉준호", "2019"]
movie2 = dict(zip(key,valus))
print(movie2)
#{'title': '기생충', 'director': '봉준호', 'year': '2019'}
key, valus 라는 리스트로 만들어 이해하기 쉽게 한거고, 서로 대응되는 두 리스트(혹은 이터러블)를 묶어서
키:밸류 구조화해 딕셔너리로 만든 함수다.
키는 사용할 수 없는 자료형
키는 불변 자료형 사용
di1= {(3,2,1): (1,2,3,)} #튜플 가능함
di2 = {1:10} #숫자 가능
di3 = {[1,2,3] : "리스트 값은 같은 걸로?"}
cannot use 'list' as a dict key (unhashable type: 'list')
딕셔너리 데이터는 쌍 형태인데 가져올 때 보통 키(key)를 사용해 접근한다.
주로 방식이 두 개이며
만들어둔 자료형
pairs = [("name", "luna"),("age",10),("job","dev")]
person2 = dict(pairs)
dict 데이터 조회
print(person2["name"]) #luna
print(person2["age"]) #10
대괄호[] 를 사용한 방식 - 일반적인 접근이며 "key" 입력하면 valus가 출력된다.
존재하는 키에 접근하면 값을 반환한단 뜻이며, 존재하지 않으면 'KeyError' 띄운다.
get 매서드 활용한 조회
print(person2.get("name")) #luna
print(person2.get("email")) #None 뜸
get(key)는 키가 없으면 None으로 반환함.
get(key, default)를 사용하면 기본값을 지정할 수 있어, 'KeyError'를 방지하고
사용자의 입력이나 외부 API 등 불확실한 키 접근에 유리해. 안전한 접근 방식이라고 한다.
default 값 "없음"을 작성하니 이리 나온다.
get 사용 예제 : 사용자 입력 처리
user_data = {
"username" : "luna",
"email" : "luna@spreatics.com",
"password" : "1234"
}
key = input("조회할 정보를 입력하세요.(username, email, password): ")
result = user_data.get(key, "존재하지 않는 데이터입니다.")
print(result)
전에 이 코드 작성할 때 키- 밸류값 여러개 넣다가 ','로 구별하지 못해 잘못된 문법 썼다는 오류 띄워봤다.
이걸 돌려봤는데 여러 정보 입력은 안되는 모양이다. (input에서 하나만 나온다.)
맞는 답 입력 시
잘못된 입력 시
파이썬 딕셔너리 자료형은 이전에 배운 것과 동일한 문법을 써서 데이터를 추가 수정할 수있다.
만약에 해당 키가 존재하지 않으면 알아서 추가해주고, 존재하는 키면 그 키의 값이 바뀐다.
1) 기본적인 추가, 수정 방법
user_data["phone"] = "010-1234-3456"
user_data["username"] = "lunaaaaa"
print(user_data)
phone(키) 정보가 추가되고 username(키)가 수정되었다.
2) update 매서드 사용
내부적으로는 각 키마다 dict [key] = value 를 반복하는 것과 동일한 효과
user_data.update({"nickname" : "luna"})
print(user_data)
3) 키가 문자열일 경우
user_data.update(phone= "010-2345-6788")
print(user_data) #교체됨
이전에 추가한 user_data["phone"] = "010-1234-3456"이 저걸로 바뀐 것이다.
다른 딕셔너리 추가
extra_data = {"city" : "seoul"}
user_data.update(extra_data)
print(user_data)
extra_data 딕셔너리를 update()로 추가한 형식이다.
딕셔너리 삭제는 del 키워드를 쓰며 [del 객체(딕셔너리명)] 형태로 사용할 경우 객체 자체를 삭제함.
데이터 삭제
del user_data["city"] #없는 값을 지우려 하면 에러가 뜸.
print(user_data)
명령어 실행 결과물. city 키 값을 누르니 그 요소가 사라졌다.
키로 제거
nickname = user_data.pop("email")
print("pop >>", user_data, "email", sep=" /// ")
nickname은 추가 안된 딕셔너리여서 email을 지웠다.
그러니 "pop>>"/// {'username': 'luna', 'password': '1234'} /// 가 된거다.
.pop(key지정)하면 그 요소가 지워졌단 뜻.
가장 마지막 요소 제거
phone = user_data.popitem() #가장 맨 뒤를 지움
print(user_data, phone, sep= " /// ")
순서 보장이 되니 마지막만 지정해 항목 지울 수 있다. 딕셔너리 비어있을 때 호출하면 keyError 뜬다.
dict 비우기
user_data.clear()
print(user_data) #{} 로 뜸
딕셔너리 주요 메서드 종류로는
user_data = {
"username" : "luna",
"email" : "luna@spreatics.com",
"password" : "1234"
}
이걸 자료 값으로.
keys : 모든 키를 반환
print("키", list(user_data.keys()))
#키 ['username', 'email', 'password']
리스트같이 나왔지만 리스트 자료형이 아니다. 변환하고 싶다면 list 함수 써야 한다.
valuse :모든 값을 반환
print("값", list(user_data.values()))
#값 ['luna', 'luna@spreatics.com', '1234']
items : 모든 쌍을 반환
print("items", list(user_data.items()))
#items [('username', 'luna'), ('email', 'luna@spreatics.com'), ('password', '1234')]
A-a / B-b 순으로 순서대로 나온다.
이후에 실습 문제 풀었는데.
빈딕셔너리 만들어서 거기에 정보를 추가해 넣어보고
user = {}
#사용자 기본 정보 추가
user.update({"username": "skywalker", "email": "sky@example.com", "level": 5})
print(user)
email_value = user["email"]
print(email_value)
sky@example.com 로 값을 읽는 명렁어 사용해 출력된다.
이건 키 수정
user["level"] = "6"
print(user)
안전하게 키 조회
key_1 = input("조회할 정보를 입력하세요.(username, email, level): ")
result_1 = user.get(key_1, "미입력.") #get은 정보 없어도 오류라고 안 한다.
print(result_1)
항목을 추가하고 삭제할 때 좀 더 깔끔한 방법도 있어 추가로 써둔 건 이러했다.
항목 추가 및 삭제
user.update({"nickname": "sky"})
del user["email"] # user.pop("email") 가능
user.update({"singup_date": "2025-07-10"})
print(user)
print(user.setdefault("singup_date","2025-07-10"))
>이건 내가 쓴 거였을 거다...
user.setdefault("singup_date","2025-07-10") #실습때 보여준 답안.
print(user)
응용 실습도 비슷했다.
students = {}
students.update({"Alice": 85, "Bob": 90, "Charlie": 95})
#순서대로 정보를 추가함.
students.update({"David": 80})
#한명 더 추가함.
students["Alice"] = 88
#요소의 값 수정
del students["Bob"]
#students.pop("Bob")로 해도 된다.
print(students)
#최종 값
이렇게 딕셔너리 강의를 다시 돌려보고, 익혀봤다. 딕셔너리 정보 구조에 대해 좀 더 이해하게 된 기분이 든다. 이제는 조건문으로 들어가야한다... 본격적으로 다루는 것이니 좀 더 공들어서 써야겠다.