자료구조 — 데이터를 체계적으로 관리하기
거래처의 이름, 사업자번호, 담당자, 금액 등 여러 정보를 엑셀의 표처럼 구조화하는 방법을 배웁니다.
리스트(List)와 딕셔너리(Dictionary)를 결합하여 실무 데이터 분석의 뼈대를 만듭니다.
학습 목표
수업이 끝나면 다음을 할 수 있어야 합니다.
key와 value를 이해한다.자료구조란? (리스트의 필요성)
자료구조(Data Structure)는 쉽게 말해 "데이터를 저장하고 관리하는 방법"입니다.
학생 5명의 이름을 저장한다고 가정해봅시다.
name1 = "김철수" name2 = "이영희" name3 = "박민수" name4 = "최지영" name5 = "홍길동"
학생이 1,000명이면 변수를 1,000개 만들어야 합니다.
students = [ "김철수", "이영희", "박민수", "최지영", "홍길동" ]
하나의 변수에 무한히 담고, for문으로 쉽게 돌릴 수 있습니다.
리스트 기초와 인덱스(Index)
리스트는 대괄호 []를 사용하여 데이터를 묶습니다.
그리고 데이터의 순서 번호(인덱스)를 사용해 값을 꺼냅니다. 인덱스는 0부터 시작합니다.
fruits = ["사과", "바나나", "오렌지"] print(fruits[0]) # 0번 데이터 print(fruits[1]) # 1번 데이터 print(fruits[2]) # 2번 데이터
사과 바나나 오렌지
인덱스로 접근해서 변수처럼 값을 다시 저장하면 됩니다.
# 이제 fruits는 ["사과", "포도", "오렌지"] 가 됩니다.
데이터 추가와 삭제 (append, remove, pop)
데이터 추가 : append()
append()는 리스트의 맨 뒤에 데이터를 계속 추가합니다.
customers = [] # 빈 리스트 준비 customers.append("ABC상사") customers.append("DEF기업") customers.append("GHI상사") print(customers)
['ABC상사', 'DEF기업', 'GHI상사']
데이터 삭제 : remove() 와 pop()
customers = ["A상사", "B기업", "C상사"] customers.remove("B기업") print(customers) # 결과: ['A상사', 'C상사']
customers = ["A상사", "B기업", "C상사"] customers.pop(1) print(customers) # 결과: ['A상사', 'C상사']
리스트 정렬 (sort)
숫자나 문자열이 섞인 리스트를 쉽게 정렬할 수 있습니다.
amounts = [5000000, 1000000, 3000000, 8000000] # 오름차순 정렬 (작은 수부터) amounts.sort() print(amounts) # [1000000, 3000000, 5000000, 8000000] # 내림차순 정렬 (큰 수부터) amounts.sort(reverse=True) print(amounts) # [8000000, 5000000, 3000000, 1000000]
리스트 안에 여러 정보를 담으면 어떻게 될까요?
customer = ["ABC상사", "123-45-67890", "홍길동", 50000000]
코드를 볼 때 customer[2]가 담당자 이름인지 단번에 알아채기 힘듭니다. 이를 해결하기 위해 딕셔너리를 배웁니다.
딕셔너리(Dictionary) 기초
딕셔너리는 데이터를 "이름(Key) → 값(Value)" 형태로 직관적으로 저장합니다.
customer = { "name": "ABC상사", "business_no": "123-45-67890", "manager": "홍길동", "amount": 50000000 }
값을 꺼낼 때는 인덱스(0, 1) 대신 Key를 사용합니다.
print(customer["name"]) # 결과: ABC상사 print(customer["amount"]) # 결과: 50000000
딕셔너리 조작 (추가, 수정, 삭제)
customer["amount"] = 70000000 # 해당 Key에 덮어쓰기
customer["type"] = "주요거래처" # 없는 Key에 값을 넣으면 새로 추가됨
del customer["manager"]
딕셔너리와 for문 (Key와 Value 함께 뽑기)
for key, value in customer.items(): print(f"{key} : {value}")
결합: 리스트 + 딕셔너리 (실무 핵심 구조)
실제 엑셀의 표처럼, "여러 개의 거래처"(리스트)가 있고 "각 거래처마다 세부 정보"(딕셔너리)가 있는 형태입니다.
customers = [ {"name": "ABC상사", "amount": 5000000, "type": "일반"}, {"name": "DEF기업", "amount": 15000000, "type": "주요"}, {"name": "GHI상사", "amount": 80000000, "type": "주요"} ]
│
├─ 거래처 1 (딕셔너리)
│ ├─ name : "ABC상사"
│ └─ amount : 5000000
│
├─ 거래처 2 (딕셔너리)
│ ├─ name : "DEF기업"
│ └─ amount : 15000000
...
for customer in customers: print(customer["name"]) print(customer["amount"]) print("---")
ABC상사 5000000 --- DEF기업 15000000 --- ...
거래처 관리 자동화 (반복 + 조건 결합)
이제 배운 것을 모두 섞습니다. 고액 거래(1천만 원 이상) 거래처만 찾아내기 같은 작업을 한 번에 처리합니다.
for customer in customers: if customer["amount"] >= 50000000: grade = "A등급" elif customer["amount"] >= 10000000: grade = "B등급" else: grade = "C등급" print(f"{customer['name']} → {customer['amount']:,}원 → {grade}")
ABC상사 → 5,000,000원 → C등급 DEF기업 → 15,000,000원 → B등급 GHI상사 → 80,000,000원 → A등급
이 구조는 수백만 개의 데이터가 있어도 완벽하게 동일하게 작동합니다.
사용자 입력과 동적 추가
사용자로부터 정보를 입력받아 실시간으로 리스트(시스템)에 추가할 수 있습니다.
customers = [] # 비어있는 데이터베이스 역할 for i in range(3): print(f"\n{i+1}번째 거래처") name = input("거래처명: ") amount = int(input("거래금액: ")) # 1. 딕셔너리로 패키징 new_cust = { "name": name, "amount": amount } # 2. 리스트에 저장 customers.append(new_cust)
검색 기능 구현하기 (found 플래그)
검색 프로그램의 가장 기본적인 형태입니다. 리스트를 돌면서 내가 찾는 값이 있는지 확인합니다.
여기서 found = False 라는 상태 표시(플래그) 변수를 활용하는 것이 좋은 테크닉입니다.
found = False search = input("검색할 거래처명: ") for customer in customers: if customer["name"] == search: print("거래처를 찾았습니다.") print(customer) found = True break # 찾았으니 더 검색할 필요 없이 반복 종료 if not found: # 다 뒤졌는데도 found가 False라면 print("거래처가 없습니다.")
5단계 최종 프로젝트 — 메뉴형 거래처 관리 시스템
1단계부터 5단계까지 배운 모든 문법(변수, 자료형, 조건문, 반복문, 리스트, 딕셔너리)을 결합하여, 콘솔 기반 미니 앱을 만듭니다.
customers = [] while True: print("\n================================") print(" 거래처 관리 프로그램") print("================================") print("1. 거래처 등록") print("2. 거래처 목록") print("3. 거래처 검색") print("4. 고액 거래처") print("5. 전체 거래금액") print("6. 종료") menu = input("메뉴 선택: ") if menu == "1": name = input("거래처명: ") business_no = input("사업자번호: ") manager = input("담당자: ") amount = int(input("거래금액: ")) c_type = input("유형: ") customers.append({ "name": name, "business_no": business_no, "manager": manager, "amount": amount, "type": c_type }) print("등록 완료!") elif menu == "2": print("\n===== 거래처 목록 =====") for c in customers: print(f"이름: {c['name']} | 금액: {c['amount']:,}원 | 담당: {c['manager']}") elif menu == "3": search = input("검색할 거래처: ") found = False for c in customers: if c["name"] == search: print(f"찾았습니다: {c}") found = True break if not found: print("없습니다.") elif menu == "4": print("\n===== 고액 거래처 (1천만 이상) =====") for c in customers: if c["amount"] >= 10000000: print(f"{c['name']} : {c['amount']:,}원") elif menu == "5": total = 0 for c in customers: total += c["amount"] print(f"\n전체 합계: {total:,}원") elif menu == "6": print("종료합니다.") break else: print("잘못된 입력입니다.")
초보자 과정에서 학생들이 만나는 첫 번째 제대로 된 미니 프로젝트입니다. 데이터를 어떻게 구조화하고(리스트+딕셔너리), 어떻게 흐름을 제어하는지(while True + if/elif) 완벽히 익힐 수 있습니다.
1~5단계 연결 및 발전 과정
우리가 지금까지 배운 파이썬의 핵심을 연결하면 다음과 같습니다.
print() / 기본 문법변수 / 자료형 / input()if / elif / elsefor / while / breakList / Dictionary과제 & 다음 단계 예고
students = [ {"name":"김철수", "score":90}, {"name":"박민수", "score":55} ... ]
위와 같은 학생 리스트(딕셔너리 포함)를 만들어 순회하며, 점수에 따라 등급(A~F)을 출력해보세요.
주어진 customers (리스트+딕셔너리 결합) 데이터를 이용해 다음을 출력하세요.
1. 전체 거래처 수 2. 전체 거래금액 3. 평균 거래금액 4. 1천만 원 이상 거래처 수
우리가 방금 만든 거래처 관리 프로그램 코드를 보면, if menu == "1" 안에 수많은 코드가 쌓여 점점 더 길어지고 복잡해집니다.
다음 6단계에서는 기능별로 코드를 분리하는 함수(def)를 배웁니다.
단순한 문법을 넘어 실무 프로그램을 어떻게 깔끔하게 유지보수할 것인가를 배우는 첫걸음이 됩니다.