Python Basic: dict

2026. 5. 28. 21:54·🐍Python

1. 딕셔너리 생성

딕셔너리 = {키: 값}

키와 값을 한 쌍으로 저장

# 성공: 딕셔너리 생성
user = {"name": "kim", "age": 20}

print(user)  # {'name': 'kim', 'age': 20}

# 성공: 여러 타입 저장 가능
data = {
    "name": "lee",
    "scores": [90, 80],
    "is_admin": False
}

print(data)
# {'name': 'lee', 'scores': [90, 80], 'is_admin': False}
# 주의: 키는 중복될 수 없음
user = {"name": "kim", "name": "lee"}

print(user)  # {'name': 'lee'}

# 주의: 리스트는 키로 사용할 수 없음
data = {[1, 2]: "hello"}  # TypeError

2. 딕셔너리 값 가져오기

딕셔너리[키]

키를 이용해 값 가져오기

# 성공: 키로 값 가져오기
user = {"name": "kim", "age": 20}

print(user["name"])  # kim
print(user["age"])   # 20
# 주의: 없는 키를 사용하면 에러 발생
user = {"name": "kim"}

print(user["age"])  # KeyError

3. get()

딕셔너리.get(키)
딕셔너리.get(키, 기본값)

키에 해당하는 값 가져오기

# 성공: 값 가져오기
user = {"name": "kim", "age": 20}

print(user.get("name"))  # kim

# 성공: 없는 키는 None 반환
print(user.get("email"))  # None

# 성공: 기본값 지정 가능
print(user.get("email", "없음"))  # 없음
# 주의: []와 다르게 에러가 나지 않음
user = {"name": "kim"}

print(user.get("age"))  # None

4. 딕셔너리 값 추가

딕셔너리[새키] = 값

새로운 키와 값 추가

# 성공: 값 추가
user = {"name": "kim"}

user["age"] = 20

print(user)
# {'name': 'kim', 'age': 20}
# 주의: 이미 있는 키면 값이 덮어쓰기됨
user = {"name": "kim"}

user["name"] = "lee"

print(user)
# {'name': 'lee'}

5. 딕셔너리 값 변경

딕셔너리[키] = 새값

기존 값 수정

# 성공: 값 변경
user = {"name": "kim", "age": 20}

user["age"] = 21

print(user)
# {'name': 'kim', 'age': 21}
# 주의: 없는 키면 새로 추가됨
user = {"name": "kim"}

user["age"] = 20

print(user)
# {'name': 'kim', 'age': 20}

6. del

del 딕셔너리[키]

특정 키와 값 삭제

# 성공: 키 삭제
user = {"name": "kim", "age": 20}

del user["age"]

print(user)
# {'name': 'kim'}
# 주의: 없는 키 삭제 시 에러 발생
user = {"name": "kim"}

del user["age"]  # KeyError

7. pop()

딕셔너리.pop(키)

키 삭제 후 값 반환

# 성공: 값 반환 후 삭제
user = {"name": "kim", "age": 20}

result = user.pop("age")

print(result)  # 20
print(user)    # {'name': 'kim'}
# 주의: 없는 키는 에러 발생
user = {"name": "kim"}

user.pop("age")  # KeyError

8. clear()

딕셔너리.clear()

딕셔너리 전체 비우기

# 성공: 전체 삭제
user = {"name": "kim", "age": 20}

user.clear()

print(user)  # {}
# 주의: 원본 딕셔너리가 직접 변경됨
user = {"name": "kim"}

result = user.clear()

print(result)  # None

9. keys()

딕셔너리.keys()

모든 키 가져오기

# 성공: 키 목록 가져오기
user = {"name": "kim", "age": 20}

print(user.keys())
# dict_keys(['name', 'age'])

# 성공: 리스트로 변환 가능
print(list(user.keys()))
# ['name', 'age']
# 주의: 결과는 리스트가 아니라 dict_keys 객체
user = {"name": "kim"}

result = user.keys()

print(result)
# dict_keys(['name'])

10. values()

딕셔너리.values()

모든 값 가져오기

# 성공: 값 가져오기
user = {"name": "kim", "age": 20}

print(user.values())
# dict_values(['kim', 20])

# 성공: 리스트 변환 가능
print(list(user.values()))
# ['kim', 20]
# 주의: 키는 포함되지 않음
user = {"name": "kim"}

print(user.values())
# dict_values(['kim'])

11. items()

딕셔너리.items()

키와 값을 함께 가져오기

# 성공: 키와 값 가져오기
user = {"name": "kim", "age": 20}

print(user.items())
# dict_items([('name', 'kim'), ('age', 20)])

# 성공: 반복문에서 자주 사용
for key, value in user.items():
    print(key, value)

# name kim
# age 20
# 주의: 튜플 형태로 저장됨
user = {"name": "kim"}

print(list(user.items()))
# [('name', 'kim')]

12. in

키 in 딕셔너리

딕셔너리에 키가 있는지 확인

# 성공: 키 존재 확인
user = {"name": "kim", "age": 20}

print("name" in user)   # True
print("email" in user)  # False
# 주의: 값 기준이 아니라 키 기준
user = {"name": "kim"}

print("kim" in user)   # False
print("name" in user)  # True

13. not in

키 not in 딕셔너리

딕셔너리에 키가 없는지 확인

# 성공: 키가 없으면 True
user = {"name": "kim"}

print("email" not in user)  # True

# 성공: 키가 있으면 False
print("name" not in user)  # False
# 주의: 값 기준이 아님
user = {"name": "kim"}

print("kim" not in user)  # True

14. for 반복문

for key in 딕셔너리:
    실행문

딕셔너리 키 반복

# 성공: 키 반복
user = {"name": "kim", "age": 20}

for key in user:
    print(key)

# name
# age

# 성공: 값 접근 가능
for key in user:
    print(key, user[key])

# name kim
# age 20
# 주의: 기본 반복은 키만 가져옴
user = {"name": "kim"}

for value in user:
    print(value)

# name

15. items() 반복문

for key, value in 딕셔너리.items():
    실행문

키와 값을 동시에 반복

# 성공: 키와 값 함께 출력
user = {"name": "kim", "age": 20}

for key, value in user.items():
    print(key, value)

# name kim
# age 20
# 주의: 변수 개수를 맞춰야 함
user = {"name": "kim"}

for item in user.items():
    print(item)

# ('name', 'kim')

16. update()

딕셔너리.update(딕셔너리)

여러 값 한 번에 추가 또는 수정

# 성공: 여러 값 추가
user = {"name": "kim"}

user.update({"age": 20, "city": "seoul"})

print(user)
# {'name': 'kim', 'age': 20, 'city': 'seoul'}

# 성공: 기존 값 수정 가능
user.update({"name": "lee"})

print(user)
# {'name': 'lee', 'age': 20, 'city': 'seoul'}
# 주의: 같은 키는 덮어쓰기됨
data = {"a": 1}

data.update({"a": 999})

print(data)
# {'a': 999}

17. copy()

딕셔너리.copy()

딕셔너리 복사

# 성공: 딕셔너리 복사
user = {"name": "kim", "age": 20}

copied = user.copy()

print(copied)
# {'name': 'kim', 'age': 20}

# 성공: 서로 다른 객체
copied["age"] = 30

print(user)
# {'name': 'kim', 'age': 20}

print(copied)
# {'name': 'kim', 'age': 30}
# 주의: 얕은 복사(shallow copy)
data = {
    "scores": [1, 2]
}

copied = data.copy()

copied["scores"][0] = 999

print(data)
# {'scores': [999, 2]}

18. len()

len(딕셔너리)

키 개수 구하기

# 성공: 키 개수 반환
user = {"name": "kim", "age": 20}

print(len(user))  # 2

# 성공: 빈 딕셔너리
data = {}

print(len(data))  # 0
# 주의: 값 개수가 아니라 키 개수 기준
data = {
    "a": [1, 2, 3]
}

print(len(data))  # 1

19. 중첩 딕셔너리

딕셔너리 = {
    키: {
        내부키: 값
    }
}

딕셔너리 안에 딕셔너리 저장

# 성공: 중첩 딕셔너리 생성
user = {
    "name": "kim",
    "contact": {
        "email": "test@test.com",
        "phone": "010-1111-2222"
    }
}

print(user["contact"]["email"])
# test@test.com
# 주의: 키를 단계별로 접근해야 함
user = {
    "contact": {
        "email": "test@test.com"
    }
}

print(user["contact"])
# {'email': 'test@test.com'}

20. 딕셔너리 컴프리헨션

{키표현식: 값표현식 for 변수 in 반복가능한값}

딕셔너리를 짧게 생성

# 성공: 숫자 제곱 저장
nums = [1, 2, 3]

result = {num: num * num for num in nums}

print(result)
# {1: 1, 2: 4, 3: 9}

# 성공: 문자열 길이 저장
fruits = ["apple", "banana"]

result = {fruit: len(fruit) for fruit in fruits}

print(result)
# {'apple': 5, 'banana': 6}
# 주의: 키가 중복되면 마지막 값만 유지
nums = [1, 1, 1]

result = {num: num * 10 for num in nums}

print(result)
# {1: 10}

21. setdefault()

딕셔너리.setdefault(키)
딕셔너리.setdefault(키, 기본값)

키가 없으면 기본값 추가 후 반환

# 성공: 없는 키면 추가됨
user = {"name": "kim"}

result = user.setdefault("age", 20)

print(result)  # 20
print(user)    # {'name': 'kim', 'age': 20}

# 성공: 이미 키가 있으면 기존 값 반환
result = user.setdefault("name", "lee")

print(result)  # kim
print(user)    # {'name': 'kim', 'age': 20}
# 주의: 기존 값은 변경되지 않음
user = {"name": "kim"}

user.setdefault("name", "lee")

print(user)
# {'name': 'kim'}

22. popitem()

딕셔너리.popitem()

마지막 키와 값 삭제 후 반환

# 성공: 마지막 데이터 제거
user = {
    "name": "kim",
    "age": 20
}

result = user.popitem()

print(result)  # ('age', 20)
print(user)    # {'name': 'kim'}
# 주의: 빈 딕셔너리에서는 에러 발생
data = {}

data.popitem()  # KeyError

23. fromkeys()

dict.fromkeys(반복가능한값)
dict.fromkeys(반복가능한값, 기본값)

여러 키를 한 번에 생성

# 성공: 기본값 None
keys = ["name", "age", "email"]

result = dict.fromkeys(keys)

print(result)
# {'name': None, 'age': None, 'email': None}

# 성공: 기본값 지정 가능
result = dict.fromkeys(keys, 0)

print(result)
# {'name': 0, 'age': 0, 'email': 0}
# 주의: 가변 객체 사용 시 공유됨
keys = ["a", "b"]

data = dict.fromkeys(keys, [])

data["a"].append(1)

print(data)
# {'a': [1], 'b': [1]}

24. sorted()

sorted(딕셔너리)

키를 기준으로 정렬

# 성공: 키 정렬
user = {
    "c": 3,
    "a": 1,
    "b": 2
}

result = sorted(user)

print(result)
# ['a', 'b', 'c']

# 성공: items()와 함께 사용 가능
result = sorted(user.items())

print(result)
# [('a', 1), ('b', 2), ('c', 3)]
# 주의: sorted() 결과는 리스트 반환
user = {"b": 2, "a": 1}

result = sorted(user)

print(type(result))
# <class 'list'>

25. 딕셔너리 합치기

딕셔너리 | 딕셔너리

딕셔너리 병합하기 (Python 3.9+)

# 성공: 딕셔너리 합치기
a = {"x": 1}
b = {"y": 2}

result = a | b

print(result)
# {'x': 1, 'y': 2}

# 성공: 같은 키는 뒤쪽 값 사용
a = {"x": 1}
b = {"x": 999}

print(a | b)
# {'x': 999}
# 주의: 원본은 변경되지 않음
a = {"x": 1}
b = {"y": 2}

result = a | b

print(a)
# {'x': 1}

26. update()로 합치기

딕셔너리.update(다른딕셔너리)

원본 딕셔너리에 병합

# 성공: 병합
a = {"x": 1}
b = {"y": 2}

a.update(b)

print(a)
# {'x': 1, 'y': 2}
# 주의: 원본 딕셔너리가 직접 변경됨
a = {"x": 1}
b = {"x": 999}

a.update(b)

print(a)
# {'x': 999}

27. 딕셔너리 컴프리헨션 조건문

{키: 값 for 변수 in 반복 if 조건}

조건에 맞는 값만 저장

# 성공: 짝수만 저장
nums = [1, 2, 3, 4]

result = {
    num: num * 10
    for num in nums
    if num % 2 == 0
}

print(result)
# {2: 20, 4: 40}

# 성공: 길이 5 이상 문자열만 저장
fruits = ["apple", "kiwi", "banana"]

result = {
    fruit: len(fruit)
    for fruit in fruits
    if len(fruit) >= 5
}

print(result)
# {'apple': 5, 'banana': 6}
# 주의: 조건에 맞는 값이 없으면 빈 딕셔너리
nums = [1, 3, 5]

result = {
    num: num
    for num in nums
    if num % 2 == 0
}

print(result)
# {}

28. 중첩 딕셔너리 반복

for key, value in 딕셔너리.items():

중첩 데이터 반복 처리

# 성공: 중첩 딕셔너리 반복
users = {
    "kim": {"age": 20},
    "lee": {"age": 30}
}

for name, info in users.items():
    print(name, info["age"])

# kim 20
# lee 30
# 주의: 내부 값도 딕셔너리일 수 있음
users = {
    "kim": {"age": 20}
}

print(users["kim"])
# {'age': 20}

29. zip()으로 딕셔너리 만들기

dict(zip(리스트1, 리스트2))

두 리스트를 묶어서 딕셔너리 생성

# 성공: 리스트 두 개 묶기
keys = ["name", "age"]
values = ["kim", 20]

result = dict(zip(keys, values))

print(result)
# {'name': 'kim', 'age': 20}
# 주의: 길이가 다르면 짧은 쪽 기준
keys = ["a", "b", "c"]
values = [1]

result = dict(zip(keys, values))

print(result)
# {'a': 1}

30. 딕셔너리 정렬

sorted(딕셔너리.items())

키 또는 값 기준 정렬

# 성공: 키 기준 정렬
data = {
    "b": 2,
    "a": 1,
    "c": 3
}

result = sorted(data.items())

print(result)
# [('a', 1), ('b', 2), ('c', 3)]

# 성공: 값 기준 정렬
result = sorted(
    data.items(),
    key=lambda item: item[1]
)

print(result)
# [('a', 1), ('b', 2), ('c', 3)]
# 주의: sorted 결과는 리스트
data = {"a": 1}

result = sorted(data.items())

print(type(result))
# <class 'list'>

31. 딕셔너리 길이 비교

len(딕셔너리)

딕셔너리 데이터 개수 확인

# 성공: 데이터 개수 확인
user = {
    "name": "kim",
    "age": 20,
    "city": "seoul"
}

print(len(user))
# 3

# 성공: 빈 딕셔너리
data = {}

print(len(data))
# 0
# 주의: 키 개수를 기준으로 셈
data = {
    "scores": [10, 20, 30]
}

print(len(data))
# 1

32. 딕셔너리 비교

딕셔너리 == 딕셔너리

딕셔너리 내용 비교

# 성공: 내용이 같으면 True
a = {"x": 1, "y": 2}
b = {"y": 2, "x": 1}

print(a == b)
# True

# 성공: 값이 다르면 False
c = {"x": 999}

print(a == c)
# False
# 주의: 순서는 상관없음
a = {"a": 1, "b": 2}
b = {"b": 2, "a": 1}

print(a == b)
# True

33. 딕셔너리 안에 리스트 저장

딕셔너리 = {
    키: 리스트
}

값으로 리스트 저장 가능

# 성공: 리스트 저장
user = {
    "scores": [90, 80, 70]
}

print(user["scores"])
# [90, 80, 70]

# 성공: 리스트 값 접근
print(user["scores"][0])
# 90
# 주의: 인덱스를 한 번 더 사용해야 함
user = {
    "scores": [90, 80]
}

print(user["scores"])
# [90, 80]

34. 딕셔너리 안에 딕셔너리 저장

딕셔너리 = {
    키: 딕셔너리
}

중첩 딕셔너리 사용

# 성공: 중첩 딕셔너리
user = {
    "name": "kim",
    "contact": {
        "email": "test@test.com",
        "phone": "010"
    }
}

print(user["contact"]["email"])
# test@test.com
# 주의: 키를 단계별로 접근해야 함
user = {
    "contact": {
        "email": "test@test.com"
    }
}

print(user["contact"])
# {'email': 'test@test.com'}

35. 리스트 안의 딕셔너리

리스트 = [
    {키: 값},
    {키: 값}
]

딕셔너리를 여러 개 저장

# 성공: 여러 사용자 저장
users = [
    {"name": "kim", "age": 20},
    {"name": "lee", "age": 30}
]

print(users[0]["name"])
# kim

print(users[1]["age"])
# 30
# 주의: 인덱스 후 키 접근 필요
users = [
    {"name": "kim"}
]

print(users[0])
# {'name': 'kim'}

36. 딕셔너리 + for 반복문

for key in 딕셔너리:

키를 하나씩 반복

# 성공: 키 출력
user = {
    "name": "kim",
    "age": 20
}

for key in user:
    print(key)

# name
# age

# 성공: 값 출력
for key in user:
    print(user[key])

# kim
# 20
# 주의: 기본 반복은 키 반복
user = {"name": "kim"}

for item in user:
    print(item)

# name

37. items() + enumerate()

enumerate(딕셔너리.items())

번호와 함께 반복

# 성공: 번호와 함께 출력
user = {
    "name": "kim",
    "age": 20
}

for index, (key, value) in enumerate(user.items()):
    print(index, key, value)

# 0 name kim
# 1 age 20
# 주의: 괄호 위치 중요
user = {"name": "kim"}

for index, item in enumerate(user.items()):
    print(index, item)

# 0 ('name', 'kim')

38. 딕셔너리 값 합계

sum(딕셔너리.values())

숫자 값들의 합계 계산

# 성공: 값 합계 계산
scores = {
    "math": 90,
    "english": 80,
    "science": 70
}

result = sum(scores.values())

print(result)
# 240
# 주의: 문자열이 포함되면 에러 발생
data = {
    "a": 1,
    "b": "2"
}

sum(data.values())  # TypeError

39. max(), min()

max(딕셔너리.values())
min(딕셔너리.values())

최댓값과 최솟값 구하기

# 성공: 최댓값
scores = {
    "math": 90,
    "english": 80,
    "science": 70
}

print(max(scores.values()))
# 90

# 성공: 최솟값
print(min(scores.values()))
# 70
# 주의: 타입이 섞이면 비교 불가
data = {
    "a": 1,
    "b": "2"
}

max(data.values())  # TypeError

40. sorted() 값 기준 정렬

sorted(딕셔너리.items(), key=lambda item: item[1])

값 기준으로 정렬

# 성공: 값 기준 오름차순
scores = {
    "kim": 70,
    "lee": 90,
    "park": 80
}

result = sorted(
    scores.items(),
    key=lambda item: item[1]
)

print(result)
# [('kim', 70), ('park', 80), ('lee', 90)]

# 성공: 내림차순
result = sorted(
    scores.items(),
    key=lambda item: item[1],
    reverse=True
)

print(result)
# [('lee', 90), ('park', 80), ('kim', 70)]
# 주의: 결과는 리스트 반환
scores = {"kim": 70}

result = sorted(
    scores.items(),
    key=lambda item: item[1]
)

print(type(result))
# <class 'list'>

41. any()

any(딕셔너리.values())

하나라도 True면 True 반환

# 성공: 하나라도 True면 True
data = {
    "a": 0,
    "b": False,
    "c": 10
}

print(any(data.values()))
# True

# 성공: 모두 False면 False
data = {
    "a": 0,
    "b": False
}

print(any(data.values()))
# False
# 주의: values()를 사용해야 값 기준 검사
data = {
    "a": 0
}

print(any(data))
# True

42. all()

all(딕셔너리.values())

모든 값이 True인지 확인

# 성공: 모두 True면 True
data = {
    "a": 1,
    "b": 2,
    "c": 3
}

print(all(data.values()))
# True

# 성공: 하나라도 False면 False
data = {
    "a": 1,
    "b": 0
}

print(all(data.values()))
# False
# 주의: 0, False, None, 빈 문자열은 False 취급
data = {
    "a": "",
    "b": 1
}

print(all(data.values()))
# False

43. setdefault() 리스트 활용

딕셔너리.setdefault(키, [])

리스트 초기화에 자주 사용

# 성공: 그룹 만들기
data = {}

data.setdefault("python", []).append("kim")
data.setdefault("python", []).append("lee")

print(data)
# {'python': ['kim', 'lee']}
# 주의: 없는 키일 때만 기본값 생성
data = {
    "python": ["kim"]
}

data.setdefault("python", []).append("lee")

print(data)
# {'python': ['kim', 'lee']}

44. 딕셔너리 컴프리헨션 if-else

{
    키: 참값 if 조건 else 거짓값
    for 변수 in 반복
}

조건에 따라 값 변경

# 성공: 짝수/홀수 저장
nums = [1, 2, 3, 4]

result = {
    num: "짝수" if num % 2 == 0 else "홀수"
    for num in nums
}

print(result)
# {1: '홀수', 2: '짝수', 3: '홀수', 4: '짝수'}

# 성공: 음수는 0 처리
nums = [10, -5, 3]

result = {
    num: num if num > 0 else 0
    for num in nums
}

print(result)
# {10: 10, -5: 0, 3: 3}
# 주의: if-else 위치 중요
nums = [1, 2]

result = {
    num: "짝수" if num % 2 == 0 else "홀수"
    for num in nums
}

print(result)
# {1: '홀수', 2: '짝수'}

45. tuple을 키로 사용

딕셔너리 = {
    (값1, 값2): 값
}

튜플은 키로 사용 가능

# 성공: 튜플 키 사용
data = {
    (1, 2): "hello",
    (3, 4): "python"
}

print(data[(1, 2)])
# hello
# 주의: 리스트는 키로 사용할 수 없음
data = {
    [1, 2]: "hello"
}
# TypeError

46. dict()

dict()

딕셔너리 생성 함수

# 성공: 빈 딕셔너리 생성
data = dict()

print(data)
# {}

# 성공: 키워드 방식 생성
user = dict(name="kim", age=20)

print(user)
# {'name': 'kim', 'age': 20}
# 주의: 키워드는 문자열만 가능
data = dict(a=1)

print(data)
# {'a': 1}

47. dict() + 리스트

dict(리스트)

튜플 리스트를 딕셔너리로 변환

# 성공: 튜플 리스트 변환
data = [
    ("name", "kim"),
    ("age", 20)
]

result = dict(data)

print(result)
# {'name': 'kim', 'age': 20}
# 주의: 요소 개수가 2개여야 함
data = [
    ("name", "kim", 123)
]

dict(data)  # ValueError

48. copy() vs =

copy()
=

복사와 참조 차이

# 성공: copy는 별도 객체 생성
a = {"x": 1}

b = a.copy()

b["x"] = 999

print(a)
# {'x': 1}

print(b)
# {'x': 999}
# 주의: = 는 같은 객체 참조
a = {"x": 1}

b = a

b["x"] = 999

print(a)
# {'x': 999}

49. 딕셔너리 삭제 반복

for key in list(딕셔너리.keys()):

반복 중 안전하게 삭제

# 성공: 조건에 맞는 키 삭제
data = {
    "a": 1,
    "b": 0,
    "c": 2
}

for key in list(data.keys()):
    if data[key] == 0:
        del data[key]

print(data)
# {'a': 1, 'c': 2}
# 주의: 반복 중 직접 삭제하면 에러 가능
data = {
    "a": 1,
    "b": 0
}

for key in data:
    del data[key]
# RuntimeError

50. 딕셔너리 정렬 후 다시 변환

dict(sorted(...))

정렬된 딕셔너리 만들기

# 성공: 키 기준 정렬
data = {
    "c": 3,
    "a": 1,
    "b": 2
}

result = dict(sorted(data.items()))

print(result)
# {'a': 1, 'b': 2, 'c': 3}

# 성공: 값 기준 정렬
result = dict(
    sorted(
        data.items(),
        key=lambda item: item[1]
    )
)

print(result)
# {'a': 1, 'b': 2, 'c': 3}
# 주의: Python 3.7+부터 입력 순서 유지
data = {
    "b": 2,
    "a": 1
}

print(data)
# {'b': 2, 'a': 1}

51. defaultdict()

from collections import defaultdict

없는 키를 자동 생성

# 성공: 기본값 자동 생성
from collections import defaultdict

data = defaultdict(int)

data["apple"] += 1
data["apple"] += 1

print(data)
# defaultdict(<class 'int'>, {'apple': 2})

# 성공: 리스트 기본값
groups = defaultdict(list)

groups["python"].append("kim")
groups["python"].append("lee")

print(groups)
# defaultdict(<class 'list'>, {'python': ['kim', 'lee']})
# 주의: 일반 dict는 없는 키 접근 시 에러
data = {}

data["apple"] += 1
# KeyError

52. Counter()

from collections import Counter

데이터 개수 세기

# 성공: 문자 개수 세기
from collections import Counter

data = ["apple", "banana", "apple"]

result = Counter(data)

print(result)
# Counter({'apple': 2, 'banana': 1})

# 성공: 문자열도 가능
text = "hello"

print(Counter(text))
# Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})
# 주의: 결과 타입은 Counter 객체
from collections import Counter

data = Counter(["a", "a"])

print(type(data))
# <class 'collections.Counter'>

53. most_common()

Counter(...).most_common()

가장 많이 나온 데이터 확인

# 성공: 빈도순 정렬
from collections import Counter

data = Counter(["a", "b", "a", "c", "a"])

print(data.most_common())
# [('a', 3), ('b', 1), ('c', 1)]

# 성공: 상위 n개 가져오기
print(data.most_common(2))
# [('a', 3), ('b', 1)]
# 주의: 결과는 리스트
from collections import Counter

data = Counter(["a"])

result = data.most_common()

print(type(result))
# <class 'list'>

54. JSON → dict

json.loads(JSON문자열)

JSON 문자열을 딕셔너리로 변환

# 성공: JSON 문자열 변환
import json

text = '{"name": "kim", "age": 20}'

result = json.loads(text)

print(result)
# {'name': 'kim', 'age': 20}

print(type(result))
# <class 'dict'>
# 주의: JSON 형식이 틀리면 에러
import json

text = "{name: kim}"

json.loads(text)
# JSONDecodeError

55. dict → JSON

json.dumps(딕셔너리)

딕셔너리를 JSON 문자열로 변환

# 성공: JSON 문자열 변환
import json

data = {
    "name": "kim",
    "age": 20
}

result = json.dumps(data)

print(result)
# {"name": "kim", "age": 20}
# 주의: 결과는 문자열
import json

data = {"a": 1}

result = json.dumps(data)

print(type(result))
# <class 'str'>

56. ensure_ascii=False

json.dumps(..., ensure_ascii=False)

한글 깨짐 방지

# 성공: 한글 유지
import json

data = {
    "name": "김철수"
}

result = json.dumps(
    data,
    ensure_ascii=False
)

print(result)
# {"name": "김철수"}
# 주의: 기본값은 유니코드 변환
import json

data = {
    "name": "김철수"
}

print(json.dumps(data))
# {"name": "\\uae40\\ucca0\\uc218"}

57. deepcopy()

copy.deepcopy()

완전한 깊은 복사

# 성공: 중첩 데이터까지 완전 복사
import copy

data = {
    "scores": [1, 2]
}

copied = copy.deepcopy(data)

copied["scores"][0] = 999

print(data)
# {'scores': [1, 2]}

print(copied)
# {'scores': [999, 2]}
# 주의: copy()는 얕은 복사
data = {
    "scores": [1, 2]
}

copied = data.copy()

copied["scores"][0] = 999

print(data)
# {'scores': [999, 2]}

58. lambda + sorted()

sorted(..., key=lambda ...)

정렬 기준 직접 지정

# 성공: 값 기준 정렬
data = {
    "kim": 70,
    "lee": 90,
    "park": 80
}

result = sorted(
    data.items(),
    key=lambda item: item[1]
)

print(result)
# [('kim', 70), ('park', 80), ('lee', 90)]

# 성공: 문자열 길이 기준 정렬
data = {
    "apple": 5,
    "kiwi": 4
}

result = sorted(
    data.keys(),
    key=lambda key: len(key)
)

print(result)
# ['kiwi', 'apple']
# 주의: lambda는 익명 함수
func = lambda x: x * 2

print(func(3))
# 6

59. 빈도수 세기 실전 패턴

dict + 반복문

데이터 등장 횟수 계산

# 성공: 직접 빈도수 계산
words = [
    "python",
    "java",
    "python"
]

count = {}

for word in words:
    count[word] = count.get(word, 0) + 1

print(count)
# {'python': 2, 'java': 1}
# 주의: 초기값 없이 += 사용 시 에러
count = {}

count["python"] += 1
# KeyError

60. 그룹핑 실전 패턴

setdefault()
defaultdict()

데이터 묶기

# 성공: 그룹별 데이터 저장
users = [
    ("python", "kim"),
    ("python", "lee"),
    ("java", "park")
]

groups = {}

for lang, name in users:
    groups.setdefault(lang, []).append(name)

print(groups)
# {
#   'python': ['kim', 'lee'],
#   'java': ['park']
# }
# 주의: append 전에 리스트가 필요
groups = {}

groups["python"].append("kim")
# KeyError

61. map() + dict

map(함수, 반복가능한값)

값을 한 번에 변환

# 성공: 값 변환
data = {
    "a": "1",
    "b": "2",
    "c": "3"
}

result = {
    key: int(value)
    for key, value in data.items()
}

print(result)
# {'a': 1, 'b': 2, 'c': 3}

# 성공: map 사용 가능
nums = ["1", "2", "3"]

result = list(map(int, nums))

print(result)
# [1, 2, 3]
# 주의: map 결과는 map 객체
nums = ["1", "2"]

result = map(int, nums)

print(result)
# <map object at ...>

62. filter() + dict

filter(함수, 반복가능한값)

조건에 맞는 데이터만 추출

# 성공: 값이 2 이상인 데이터만 추출
data = {
    "a": 1,
    "b": 2,
    "c": 3
}

result = dict(
    filter(
        lambda item: item[1] >= 2,
        data.items()
    )
)

print(result)
# {'b': 2, 'c': 3}
# 주의: filter 결과는 filter 객체
data = [1, 2, 3]

result = filter(
    lambda x: x > 1,
    data
)

print(result)
# <filter object at ...>

63. zip() + 딕셔너리 반복

zip(딕셔너리1.items(), 딕셔너리2.items())

두 딕셔너리 동시에 반복

# 성공: 동시에 반복
a = {
    "x": 1,
    "y": 2
}

b = {
    "x": 10,
    "y": 20
}

for item1, item2 in zip(a.items(), b.items()):
    print(item1, item2)

# ('x', 1) ('x', 10)
# ('y', 2) ('y', 20)
# 주의: 길이가 다르면 짧은 쪽 기준
a = {"x": 1}
b = {"x": 10, "y": 20}

for item in zip(a.items(), b.items()):
    print(item)

# ((‘x’, 1), (‘x’, 10))

64. 딕셔너리 unpacking

**

딕셔너리 펼치기

# 성공: 딕셔너리 합치기
a = {"x": 1}
b = {"y": 2}

result = {
    **a,
    **b
}

print(result)
# {'x': 1, 'y': 2}

# 성공: 함수 인자로 사용 가능
def hello(name, age):
    print(name, age)

user = {
    "name": "kim",
    "age": 20
}

hello(**user)
# kim 20
# 주의: 같은 키는 뒤쪽 값 사용
a = {"x": 1}
b = {"x": 999}

result = {
    **a,
    **b
}

print(result)
# {'x': 999}

65. 딕셔너리 unpacking 함수

함수(**딕셔너리)

키를 함수 매개변수로 전달

# 성공: 함수 인자 전달
def user_info(name, age):
    print(name, age)

data = {
    "name": "kim",
    "age": 20
}

user_info(**data)
# kim 20
# 주의: 키 이름이 매개변수와 같아야 함
def hello(name):
    print(name)

data = {
    "age": 20
}

hello(**data)
# TypeError

66. 함수에서 kwargs

**kwargs

가변 키워드 인자 받기

# 성공: 여러 키워드 받기
def hello(**kwargs):
    print(kwargs)

hello(name="kim", age=20)
# {'name': 'kim', 'age': 20}

# 성공: 값 접근 가능
def hello(**kwargs):
    print(kwargs["name"])

hello(name="kim")
# kim
# 주의: kwargs는 딕셔너리 형태
def hello(**kwargs):
    print(type(kwargs))

hello(a=1)
# <class 'dict'>

67. 딕셔너리 정렬 실전

sorted(..., reverse=True)

내림차순 정렬

# 성공: 값 기준 내림차순
scores = {
    "kim": 70,
    "lee": 90,
    "park": 80
}

result = sorted(
    scores.items(),
    key=lambda item: item[1],
    reverse=True
)

print(result)
# [('lee', 90), ('park', 80), ('kim', 70)]
# 주의: reverse=True는 전체 정렬 뒤집기
nums = [1, 2, 3]

print(sorted(nums, reverse=True))
# [3, 2, 1]

68. 특정 키만 추출

딕셔너리[키]

원하는 데이터만 꺼내기

# 성공: 특정 키만 추출
user = {
    "name": "kim",
    "age": 20,
    "city": "seoul"
}

result = {
    "name": user["name"],
    "age": user["age"]
}

print(result)
# {'name': 'kim', 'age': 20}
# 주의: 없는 키는 에러 발생
user = {
    "name": "kim"
}

print(user["age"])
# KeyError

69. 여러 딕셔너리 합계 계산

반복문 + sum()

데이터 총합 계산

# 성공: 전체 점수 합산
students = [
    {"score": 90},
    {"score": 80},
    {"score": 70}
]

result = sum(
    student["score"]
    for student in students
)

print(result)
# 240
# 주의: 없는 키 접근 시 에러
students = [
    {"score": 90},
    {}
]

result = sum(
    student["score"]
    for student in students
)
# KeyError

70. 실전 JSON 데이터 처리

json.loads()

API 데이터 처리에 자주 사용

# 성공: JSON 데이터 처리
import json

text = """
{
    "users": [
        {"name": "kim", "age": 20},
        {"name": "lee", "age": 30}
    ]
}
"""

data = json.loads(text)

print(data["users"][0]["name"])
# kim

print(data["users"][1]["age"])
# 30
# 주의: JSON은 문자열 형태
import json

text = '{"name": "kim"}'

print(type(text))
# <class 'str'>

71. 키 존재 여부 안전하게 처리

if 키 in 딕셔너리:

없는 키 에러 방지

# 성공: 안전하게 접근
user = {
    "name": "kim"
}

if "age" in user:
    print(user["age"])
else:
    print("없음")

# 없음
# 주의: 바로 접근하면 에러 가능
user = {
    "name": "kim"
}

print(user["age"])
# KeyError

72. get() 실전 패턴

딕셔너리.get(키, 기본값)

기본값 처리

# 성공: 기본값 사용
user = {
    "name": "kim"
}

age = user.get("age", 0)

print(age)
# 0

# 성공: 문자열 기본값
email = user.get("email", "없음")

print(email)
# 없음
# 주의: 없는 키는 None 반환
user = {}

print(user.get("age"))
# None

73. 여러 키 한 번에 확인

all()

필수 데이터 검사

# 성공: 모든 키 존재 확인
user = {
    "name": "kim",
    "age": 20
}

required = ["name", "age"]

result = all(
    key in user
    for key in required
)

print(result)
# True
# 주의: 하나라도 없으면 False
user = {
    "name": "kim"
}

required = ["name", "age"]

print(
    all(key in user for key in required)
)
# False

74. dict comprehension + 조건 변경

if 조건 else 값

조건별 데이터 변환

# 성공: 점수 등급 만들기
scores = {
    "kim": 90,
    "lee": 60,
    "park": 30
}

result = {
    name: "합격" if score >= 60 else "불합격"
    for name, score in scores.items()
}

print(result)
# {
#   'kim': '합격',
#   'lee': '합격',
#   'park': '불합격'
# }
# 주의: if 위치 중요
nums = [1, 2]

result = {
    num: "짝수" if num % 2 == 0 else "홀수"
    for num in nums
}

print(result)
# {1: '홀수', 2: '짝수'}

75. setdefault() 실전 그룹핑

setdefault()

카테고리별 묶기

# 성공: 그룹핑
data = [
    ("backend", "kim"),
    ("backend", "lee"),
    ("frontend", "park")
]

groups = {}

for team, name in data:
    groups.setdefault(team, []).append(name)

print(groups)
# {
#   'backend': ['kim', 'lee'],
#   'frontend': ['park']
# }
# 주의: 리스트 초기화 필요
groups = {}

groups["backend"].append("kim")
# KeyError

76. Counter 실전 단어 개수

Counter()

단어 빈도 계산

# 성공: 단어 개수 세기
from collections import Counter

words = """
python java python spring
"""

result = Counter(words.split())

print(result)
# Counter({
#   'python': 2,
#   'java': 1,
#   'spring': 1
# })
# 주의: split 안 하면 문자 단위 계산
from collections import Counter

text = "hello"

print(Counter(text))
# Counter({
#   'l': 2,
#   'h': 1,
#   'e': 1,
#   'o': 1
# })

77. Counter + most_common 실전

most_common()

가장 많이 나온 데이터 찾기

# 성공: 인기 데이터 찾기
from collections import Counter

data = [
    "python",
    "java",
    "python",
    "python",
    "spring"
]

counter = Counter(data)

print(counter.most_common(1))
# [('python', 3)]

print(counter.most_common(2))
# [('python', 3), ('java', 1)]
# 주의: 결과는 리스트
from collections import Counter

data = Counter(["a"])

result = data.most_common()

print(type(result))
# <class 'list'>

78. nested get()

get().get()

중첩 딕셔너리 안전 접근

# 성공: 안전하게 접근
user = {
    "contact": {
        "email": "test@test.com"
    }
}

email = user.get(
    "contact",
    {}
).get("email")

print(email)
# test@test.com
# 주의: 없는 키 직접 접근 시 에러
user = {}

print(user["contact"]["email"])
# KeyError

79. dictionary merge 실전

**
|
update()

딕셔너리 병합 방식

# 성공: unpacking 병합
a = {"x": 1}
b = {"y": 2}

result = {
    **a,
    **b
}

print(result)
# {'x': 1, 'y': 2}

# 성공: | 병합
result = a | b

print(result)
# {'x': 1, 'y': 2}
# 주의: update는 원본 변경
a = {"x": 1}
b = {"y": 2}

a.update(b)

print(a)
# {'x': 1, 'y': 2}

80. API 응답 처리 실전

json.loads()

실무 JSON 처리 패턴

# 성공: API 응답 처리
import json

response = """
{
    "status": "success",
    "data": {
        "users": [
            {
                "name": "kim",
                "age": 20
            }
        ]
    }
}
"""

result = json.loads(response)

users = result["data"]["users"]

print(users[0]["name"])
# kim

print(users[0]["age"])
# 20
# 주의: 문자열 상태에서는 접근 불가
response = '{"name": "kim"}'

print(response["name"])
# TypeError

 

'🐍Python' 카테고리의 다른 글

Python Basic: set  (0) 2026.05.28
Python Basic: tuple  (0) 2026.05.28
Python Basic: list  (0) 2026.05.28
Python Basic: String  (0) 2026.05.28
'🐍Python' 카테고리의 다른 글
  • Python Basic: set
  • Python Basic: tuple
  • Python Basic: list
  • Python Basic: String
limdaeil
limdaeil
limdaeil 님의 블로그 입니다.
  • limdaeil
    limdaeil
    limdaeil
  • 전체
    오늘
    어제
    • 분류 전체보기 (50) N
      • 💭Retrospective (16)
      • 🐬MySQL (1)
      • 🐍Python (5)
      • 🍃SpringBoot (14) N
      • ♾️Devops (1)
      • 🌎Network (2)
      • 📚Read & 👨‍🏫Course (10)
      • 🥕Fortinet (0)
      • Programmers (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    레이스 컨디션
    MySQL
    한빛미디어
    맛있는 디자인 피그마 With AI
    mcp
    Concurrency
    한빛아카데미
    HttpMessageConverter
    Python
    나는리뷰어다
    회고
    spring boot
    gradle
    클린 아키텍처 with 파이썬
    redis
    이것이 스프링 AI다
    서평단
    jwt
    optimistic rock
    distributed lock
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
limdaeil
Python Basic: dict
상단으로

티스토리툴바