포트폴리오/[IoT 기반 피지컬 AI 교육일지]

[ 파이썬 기초 ] #3 리스트, 반복문(for), 딕셔너리 활용 (43일차 기록)

개발자혜콩 2026. 4. 22. 11:30

1. 오늘 한 것

① 파이썬 리스트(List) 구조 및 인덱싱/슬라이싱

  • 파이썬의 리스트는 숫자, 문자열, 불리언 등 다양한 자료형을 한 번에 담을 수 있는 강력한 배열 구조를 가짐.
  • 접근 연산자 이중 사용: 리스트 안의 문자열이나, 리스트 안의 리스트(2차원 배열)에 접근할 때 인덱스를 연달아 사용하는 문법 실습.
# 04_1_list_ex1.py 실습 발췌
array:list = [273, 32, 103, "문자열", True, False]

print(array[1:3])    # 슬라이스 연산자 (결과: [32, 103])
print(array[3][0])   # "문자열" 요소 안에서 다시 0번째 인덱스 접근 (결과: 문)

# 2차원 리스트 이중 접근
array2:list =  [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
print(array2[1][1])  # 1번 인덱스 리스트의 1번 요소 (결과: 5)

② 리스트 요소 추가 (append vs insert)

  • append(요소): 리스트의 맨 마지막(우측 끝)에 새로운 요소를 추가.
  • insert(위치, 요소): 리스트의 특정 인덱스를 지정하여 요소 추가 (기존 요소들은 뒤로 밀려남).
# 04_1_list_ex3.py 실습 발췌
list_a = [1, 2, 3]
list_a.append(4)     # 뒤에 추가 -> [1, 2, 3, 4]
list_a.insert(2, 10) # 2번 인덱스에 추가 -> [1, 2, 10, 3, 4]

 


③ for 반복문 활용 (다중 리스트 및 인덱스 제어)

  • in 연산자와 조합하여 리스트의 요소를 하나씩 빼오는 기본 구조부터, range(len())을 활용해 여러 리스트의 인덱스를 동시에 추적하는 로직을 구현함.
# 04_2_for_스펠링퀴즈.py (range와 인덱스를 활용한 동시 접근)
questions = ['tr_in', 'b_s', '_axi', 'air_lane']
answers = ['a', 'u', 't', 'p']

for i in range(len(questions)):  # 0부터 3까지 반복
    q = '%s 에서 밑줄(_) 안에 들어갈 알파벳은?' % questions[i]
    ans = input(q)

    if ans == answers[i]:  # 동일한 인덱스 i로 정답 리스트 비교
        print('정답입니다!')
    else:
        print('틀렸습니다!')
# 04_2_for_확인문제.py (중첩 for문을 활용한 2차원 배열 완전 탐색)
list_of_list = [ [1, 2, 3], [4, 5, 6, 7], [8, 9] ]
for i in list_of_list:
    for j in i:
        print(j)  # 1부터 9까지 순차적으로 1열 출력

 


④ 딕셔너리(Dictionary) 구조 및 빈도수 집계 알고리즘

  • 키(Key)와 값(Value)의 쌍으로 이루어진 딕셔너리를 활용해 객체의 속성을 표현하거나, 리스트 내의 데이터 등장 횟수를 카운팅하는 히스토그램 로직을 직접 구현함.
# 04_확인문제_3번.py (숫자 등장 빈도수 집계 로직)
numbers = [1,2,6,8,4,3,2,1,9,5,4,9,7,2,1,3,5,4,8,9,7,2,3]
counter = {}

for number in numbers:
    if number in counter:      # 딕셔너리에 이미 해당 숫자가 키로 등록되어 있다면
        counter[number] += 1   # 빈도수 1 증가
    else:                      # 처음 보는 숫자라면
        counter[number] = 1    # 새로운 키로 추가하고 값을 1로 초기화

print(counter) # {1: 3, 2: 4, 6: 1, 8: 3, 4: 4, ...} 형태로 출력됨

 

 


2. 문제 / 헷갈린 점

① 딕셔너리에서 존재하지 않는 키(Key) 접근 에러 (KeyError)

  • 상황: 빈도수 집계 실습에서 무작정 counter[number] += 1을 실행하려 했을 때 에러가 발생함.
  • 해결: 딕셔너리는 처음부터 모든 키가 존재하는 것이 아니므로, 값을 증가시키기 전에 해당 키가 내부에 존재하는지 if number in counter:로 먼저 묻고, 없다면 1로 초기화하는 분기 처리가 반드시 필요함을 구조적으로 체득함.

② range() 함수의 쓰임새 판단

  • 상황: 언제 for i in array:를 쓰고, 언제 for i in range(len(array)):를 써야 할지 혼동됨.
  • 해결: 단순히 리스트 안의 값만 꺼내 쓸 때는 전자(요소 직접 접근)가 파이썬답고 깔끔하다. 그러나 '스펠링 퀴즈' 예제처럼 문제 리스트와 정답 리스트, 즉 두 개 이상의 배열을 같은 번호표(인덱스)로 묶어서 연동해야 할 때는 후자(인덱스 기반 접근)를 써야 한다는 원칙을 정립함.

3. 오늘 배운 핵심

  • 슬라이싱([:]) 내부에는 반복문이 숨어있다: 리스트를 자르는 슬라이스 연산자는 단순히 자르는 행위가 아니라, 내부적으로 인덱스를 순회하며 새 리스트를 만들어내는 강력한 기능이다.
  • 이중 접근 연산([][])의 유연성: 리스트 안의 리스트, 심지어 리스트 안의 문자열조차도 배열[인덱스][인덱스] 형태로 파고들어 원소 단위까지 추출할 수 있다.
  • 딕셔너리는 데이터 분류/통계의 핵심이다: 순서가 중요한 데이터는 '리스트'에, 이름(Key)표가 필요하거나 빈도수를 세어야 하는 통계성 데이터는 '딕셔너리'에 담는 것이 파이썬 데이터 처리의 기본 공식이다.

4. 다음 목표

  • 특정 기능을 재사용할 수 있도록 묶어두는 사용자 정의 함수(def)의 선언과 매개변수/반환값(return) 다루기.
  • 리스트/딕셔너리 내포(Comprehension) 등 코드를 한 줄로 줄이는 파이썬 고급 문법 도전