이번 편의 목표: 키와 값으로 한 건의 자료를 표현하고 여러 건을 순회합니다.
`["커피", 4500]`이라는 리스트를 처음 보는 사람은 4500이 가격인지 재고 수량인지 추측해야 합니다. 딕셔너리는 값에 의미를 나타내는 키를 붙입니다. 지출 기록의 한 건을 표현하기에 좋은 구조입니다.
위치 대신 이름으로 읽는다
expense = {"item": "커피", "amount": 4500}
print(expense["item"])
expense["amount"] = 5000
expense["category"] = "식비"
print(expense.get("memo", "메모 없음"))
for key, value in expense.items():
print(f"{key}: {value}")
expenses = [
{"item": "커피", "amount": 4500},
{"item": "점심", "amount": 8000},
{"item": "버스", "amount": 1500},
]
total = 0
for row in expenses:
print(f"{row['item']}: {row['amount']:,}원")
total += row["amount"]
print(f"총액: {total:,}원")한 건의 `expense`에서 `expense["item"]`은 `커피`입니다. 키에 값을 대입하면 기존 키는 수정되고 새로운 키는 추가됩니다. 여러 건을 담을 때는 딕셔너리들을 리스트 안에 넣습니다. 바깥 리스트는 기록의 순서, 안쪽 딕셔너리는 한 기록의 항목을 표현합니다.
없는 키를 읽는 두 방법
`expense["memo"]`처럼 없는 키를 직접 읽으면 `KeyError`가 발생합니다. 꼭 있어야 하는 필드에서 이 오류는 자료의 문제를 알려 주는 유용한 신호입니다. 반면 선택적인 메모라면 `expense.get("memo", "메모 없음")`처럼 기본값을 둘 수 있습니다.
`get()`은 키가 없을 때의 동작을 바꿀 뿐 자료형을 검사하지 않습니다. `amount`에 `"많음"`이 들어 있으면 합계 계산은 여전히 실패합니다. 딕셔너리를 쓴다고 입력 자료가 자동으로 올바르게 되는 것은 아닙니다.
순회와 키의 규칙
`for key in expense:`는 키를 하나씩 꺼냅니다. 키와 값을 함께 읽으려면 `.items()`를 사용합니다. `"memo" in expense`는 메모라는 키가 있는지 검사합니다. 값 안의 특정 단어를 검색하는 문법이 아닙니다.
같은 딕셔너리에서 키는 중복될 수 없습니다. 같은 키에 다시 대입하면 이전 값이 덮어써집니다. 따라서 지출 항목 이름을 곧바로 키로 사용해 `{"커피": 4500}`만 저장하면 같은 날 커피를 두 번 구입한 기록을 구별하기 어렵습니다. 여러 거래를 보존하려면 앞 예제처럼 리스트에 한 건씩 추가하는 편이 자연스럽습니다.
직접 해 보기
식비와 교통비 기록에서 분류별 합계를 딕셔너리에 누적해 보세요. 처음 등장하는 분류는 기존 합계가 0이라고 생각하면 됩니다.
해설
expenses = [
{"category": "식비", "amount": 4500},
{"category": "교통", "amount": 1500},
{"category": "식비", "amount": 8000},
]
totals = {}
for row in expenses:
category = row["category"]
totals[category] = totals.get(category, 0) + row["amount"]
print(totals)결과는 `{'식비': 12500, '교통': 1500}`입니다. 같은 원리로 단어별 출현 횟수나 날짜별 건수도 셀 수 있습니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
등록된 댓글이 없습니다.