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
  • 전체
    오늘
    어제
    • 분류 전체보기 (84) N
      • 💭Retrospective (21)
      • 🥕FrontEnd (0)
      • 🐬MySQL (3) N
      • 🐍Python (5)
      • 🍃SpringBoot (33) N
      • ☕Java (1)
      • ♾️Devops (1)
      • 🌎Network (2)
      • 📚Read & 👨‍🏫Course (10)
      • Programmers (1)
      • 🧪Test (7)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    jwt
    redis
    Spring
    optimistic rock
    DI
    나는리뷰어다
    MySQL
    Python
    IoC
    distributed lock
    spring boot
    한빛미디어
    Mockito
    회고
    책
    gradle
    한빛아카데미
    junit
    서평단
    Concurrency
  • 최근 댓글

  • 최근 글

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

티스토리툴바