카카오클라우드 AIaaS 교육/AIaaS를 위한 머신러닝&AI

[스나이퍼팩토리] AIaaS 마스터 클래스 9주차 DAY 38,39 - python 기초

mangji2 2025. 5. 22. 15:25

[1] python 기초 수업 복습

✅ 리스트 (List)

● 개념

  • 순서가 있는 변경 가능한 컬렉션
  • 대괄호 []를 사용해 생성
  • 다양한 데이터 타입 저장 가능
  • 중복 허용

주요 특징

  • 인덱싱과 슬라이싱 가능 (list[0], list[1:3] 등)
  • 리스트 안에 리스트도 포함 가능 (중첩 리스트)

생성 방법

fruits = ["사과", "바나나", "체리"]
numbers = list(range(1, 6))  # [1, 2, 3, 4, 5]
empty_list = []

 리스트 컴프리헨션

squares = [x**2 for x in range(1, 6)]

 

● 리스트 수정

fruits = ["사과","바나나","체리"]

#요소 변경
fruits[1] = "블루베리"
#요소 추가
fruits.append("딸기")
#특정 위치에 삽입
fruits.insert(1,"포도")
#리스트 확장
more_fruits = ["키위","망고"]
fruits.extend(more_fruits)
#요소 제거
fruits.remove("체리")
#특정 위치 요소 제거 및 반환
removed = fruits.pop(2)
#리스트 정렬
fruits.sort()
#리스트 역순으로 뒤집기
fruits.reverse()
#리스트 길이
print(len(fruits))
#요소 개수 세기
fruits.count("사과")
#요소 위치 찾기
fruits.index("키위")
#리스트 내용 비우기
fruits.clear()

● enumerate

- enumerate란?

  • 인덱스와 값 형태의 튜플을 반환하는 파이썬 내장 함수이다.

- zip() 함수란?

  • 두 개 이상의 반복 가능한 객체의 요소들을 짝지어 튜플의 형태로 묶어주는 함수이다.
#리스트 요소와 인덱스를 함께 순회할 때 유용
fruits = ["사과",'바나나','체리','딸기']
for index,fruits in enumerate(fruits, start=1): // 시작 인덱스 지정가능
   print(f"{index}번: {fruit}")
   
# 리스트의 특정 값 위치 찾기
blue = [i for i,color in enumerate(colors) if color == "파랑"]

#여러 리스트 동시 순회 (ZIP과 함께 사용)
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]

for i,(name, score) in enumerate(zip(names,scores)), 1):
	print()

● 목록 관리 프로그램

#목록 관리 프로그램
# 할 일 추가
def add_task(task):
	task.append(task)
    
# 할 일 완료 (삭제)
def complete_task(task_index):
	if 0 <= task_index < len(tasks):
    	completed = tasks.pop(task_index)
    else:
    	print("잘못된 할 일 번호입니다.")
        
# 할 일 목록 조회
def view_tasks():
	if tasks:
    	for i,task in enumerate(tasks):
        	print(f"{i+1}, {task}")

 

● 중첩 리스트

  • 다차원 데이터를 표현할 때 유용 
  • 얕은 복사 - 최상위 컨테이너만 새로 생성하고, 내부 요소들은 원본과 동일한 객체를 참조한다. 
  • 깊은 복사 - 원본과 완전히 독립된 객체 생성, 어느 한쪽 수정해도 다른 쪽에 영향 주지 않음
row = [0] * 3
bad_matrix = [row] * 3 //row객체를 참조하는 3개의 객체 생성
bad_matrix[0][0] = 1 //모든 행의 첫 번째 요소가 1로 변경됨

#올바른 방법
good_matrix = [[0 for _ in range(3)] for _ in range(3)]

✅ 튜플 (Tuple)

 개념

  • 순서가 있는 변경 불가능한 컬렉션
  • 소괄호 ()로 생성
  • 다양한 데이터 타입 저장 가능

주요 특징

  • 인덱싱, 슬라이싱 가능
  • 불변성이 보장되어 안정적인 데이터 저장에 유용

생성 예시

tuple1 = (1, 2, 3)
tuple2 = ("apple", 3.14, True)
# 다중 반환 값 처리
def get_dimensions():
	width = 800
    height = 600
    depth = 3
    return width, height, depth #암시적 튜플 반환

# 반환값을 튜플로 받기
dimensions = get_dimensions()
print(f"튜플 : {dimenstions}")

✅ 딕셔너리 (Dictionary)

개념

  • 키(key)-값(value) 쌍으로 구성된 컬렉션
  • 중괄호 {} 사용
  • 키는 불변 객체만 가능 (문자열, 숫자, 튜플 등)
  • 값은 어떤 타입이든 가능

주요 특징

  • 순서 없음 
  • 키를 통해 값에 직접 접근 가능 (dict["key"])

예시

person = {
    "name": "홍길동",
    "age": 25,
    "email": "hong@example.com"
}

student = {"name": "홍길동", "age" : 20, "grade":"A"}
student2 = dict(name="김철수", age=22, grade="8")
items = [(),(),()]

#항목 삭제
del student["name"]
student.pop("age")
#keys() : 모든 키 반환
list(student.keys())
#value() : 모든 값 반환
list(student.values())
#items() : 키-값 쌍 반환
list(student.items())
#update(): 딕셔너리 병합/갱신
new_info = {"grade: "A", "age":21}
student.update(new_info)
#clear(): 모든 항목 삭제
temp_dict = {"temp": 1}
temp_dict.clear()

#copy(): 딕셔너리 얕은 복사
student_copy = student.copy()

 

- keys(),values() 응답은 list 형태임

• 타입은 dict_keys, dict_values 클래스이나 리스트로 변환 가능하다.

• Items() 응답은 tuple 형태    • 타입은 Dict_items 클래스 이나 tuple로 변환 가능

 

#딕셔너리 컴프리헨션
# 1. 기본 형태
squares = {x: x**2 for x in range(1,6)}
# 2. 조건부 딕셔너리 컴프리헨션
even = {x: x**2 for x in range(1,11) if x % 2 == 0}
# 3. 값 변환 예제
fruits = ['apple','banana','cherry']
fruit_lengths =  {fruit: len(fruit) for fruit in fruits}

✅ 집합 (Set)

● 개념

  • 중복을 허용하지 않는 순서 없는 컬렉션
  • 중괄호 {} 또는 set()으로 생성

주요 특징

  • 중복 자동 제거
  • 합집합(|), 교집합(&), 차집합(-), 대칭차집합(^) 등 다양한 연산 지원

예시

set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1 & set2)  # 교집합: {3}

#집합 생성
# 1.중괄호로 생성
fruits = {'사과','바나나','체리'}
# 2. set() 사용
numbers = set([1,2,3,2,1]) //중복 제거됨
# 3.문자열로 생성
chars = set("hello") //{'h','e','l','o'} 이런 식으ㅓ로 생성
# 4. 빈 집합 생성 !! 여기서 빈 중괄호는 딕셔너리
empty_set = set()
not_set = {}

#집합 연산
#기본 집합 생성
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# 합집합 (Union): A와 B의 모든 요소
print("합집합 (A | B):", A | B)  # {1, 2, 3, 4, 5, 6, 7, 8}
print("합집합 (A.union(B)):", A.union(B))  # 위와 동일

# 교집합 (Intersection): A와 B 모두에 있는 요소
print("교집합 (A & B):", A & B)  # {4, 5}
print("교집합 (A.intersection(B)):", A.intersection(B))  # 위와 동일

# 차집합 (Difference): A에는 있지만 B에는 없는 요소
print("차집합 (A - B):", A - B)  # {1, 2, 3}
print("차집합 (A.difference(B)):", A.difference(B))  # 위와 동일

# 대칭 차집합
A ^ B

#부분집합
C.issubset(A)
C <= A

#서로소(isdisjoint)

#집합 수정
# 기본 집합
fruits = {"사과", "바나나", "체리"}

# 요소 추가
fruits.add("딸기")

# 여러 요소 추가
fruits.update(["망고", "블루베리"])

# 요소 제거 (존재하지 않으면 오류 발생)
fruits.remove("바나나")

# 요소 제거 (존재하지 않아도 오류 없음)
fruits.discard("키위")  # 없지만 오류 없음

# 임의의 요소 제거 및 반환
popped = fruits.pop()

# 모든 요소 제거
fruits.clear()

 

✅ 조건문 (if, elif, else)

●  개념

  • 조건에 따라 코드의 실행 흐름을 제어한다.
  • 들여쓰기를 통해 블록 구분

조건문 구조

if 조건:
    실행문
elif 다른조건:
    실행문
else:
    실행문

 비교 연산자

  • ==, !=, >, <, >=, <=

● 멤버십 연산자

# for 루프와 함께 사용
fruits = ["사과", "바나나", "체리", "오렌지"]

for fruit in fruits:
    if fruit in ["사과", "오렌지"]:
        print(f"{fruit}는 과일 주스로 적합합니다.")

# 조건문과 함께 사용
user_input = "체리"

if user_input in fruits:
    print(f"{user_input}는 과일 목록에 있습니다.")
else:
    print(f"{user_input}는 과일 목록에 없습니다.")

논리 연산자

  • and, or, not
  • 우선순위: not > and > or

삼항 연산자

result = "참" if 조건 else "거짓"

예시

age = 20
if age >= 18:
    print("성인입니다.")
elif age >= 13:
    print("청소년입니다.")
else:
    print("어린이입니다.")

 

✅ 반복문 (for, while)

개념

  • 특정 코드를 여러 번 반복해서 실행할 수 있게 하는 구조
  • 대표적인 반복문: for, while

for 문

  • 시퀀스(리스트, 문자열, 튜플 등)의 각 요소를 순회할 때 사용
fruits = ["사과", "바나나", "체리"]
for fruit in fruits:
    print(fruit)

 range 함수와 함께 사용

for i in range(3):
    print(i)  # 0, 1, 2

 while 문

  • 조건이 참인 동안 반복
count = 0
while count < 3:
    print(count)
    count += 1

break & continue

  • break: 반복문을 즉시 종료
  • continue: 현재 반복을 건너뛰고 다음 반복으로 진행

[2] 과제 리뷰

 

이번 과제 중에 유일하게 오류가 난 과제에 대해서 틀린 이유와 고친 코드에 대해서 리뷰해 보겠다.

 

문제

- 소셜 네트워크에서 사용자 간의 관계와 추천 시스템을 구현하는 프로그램을 작성해 보는 거였다.
공통 관심사를 가진 사람들의 리스트와 공통 관심사를 갖지 않는 사람들의 리스트를 반환하는 함수를
작성해 보았다.
 

틀린 코드

- 우선 사용자 이름인 key의 취미 리스트를 집합 set으로 바꾸고 반복문을 돌면서 다른 사람의 취미 list와 교집합을 찾아

존재하면 positive_list에 존재하지 않으면 negative_list에 append하여 두 개의 name key들이 담긴 list를 반환하는 함수를

구현해 보았다.

#과제
#소셜 네트워크에서 사용자 간의 관계와 추천 시스템을 구현하는 프로그램 작성
# 공통 관심사를 갖는 친구 응답
# 공통 관심사가 없는 친구 응답
hobbies = {
    "Alice": ["음악", "영화", "독서"],
    "Bob": ["스포츠", "여행", "음악"],
    "Charlie": ["프로그래밍", "게임", "영화"],
    "David": ["요리", "여행", "사진"],
    "Eve": ["프로그래밍", "독서", "음악"],
    "Frank": ["스포츠", "게임", "요리"],
    "Grace": ["영화", "여행", "독서"]
}
def hob(hobbies):
    positive_list = []
    negative_list = []
    my_name = input("name:")
    for x in hobbies:
        if((hobbies[x] ^ hobbies[my_name]) != null):
            positive_list.append(x)
        else:
            negative_list.append(x)
    return positive_list,negative_list

positive_freind, negative_friend = hob(hobbies)
print(f"공통 관심사를 갖는 친구: {positive_freind}")
print(f"공통 관심사가 없는는 친구: {negative_friend}")

 

 

오류

오류 1: null → None

🔴 잘못된 부분

if((hobbies[x] ^ hobbies[my_name]) != null):
  • null은 Python에 없는 키워드임
  • Python에서는 null 대신 None을 사용해야했다.

 오류 2: 리스트에 ^ 연산 사용 & set collection은 인덱싱 x

🔴 잘못된 부분

hobbies[x] ^ hobbies[my_name]
  • ^ 는 set 에서 가능한 연산이다.
  • 그런데 hobbies[x]는 리스트이기 때문에 바로 ^ 연산 불가능하기 때문에 set으로 변경 후 계산해야 했다.
  • 그리고 ^ 이 연산자는 대칭 차집합 연산자로 한쪽에만 있는 요소들을 남기는 연산자이고
  • 교집합은 & 이 연산자를 써야한다.
  • set은 인덱싱으로 특정 위치에 접근할 수 없다.

✅ 수정 코드

def hob(hobbies):
    positive_list = []
    negative_list = []

    my_name = input("name:")

    my_hobby = set(hobbies[my_name])

    for other_name,other_hobbies in hobbies.items():
        if other_name == my_name:
            continue
        if my_hobby & set(other_hobbies):
            positive_list.append(other_name)
        else:
            negative_list.append(other_name)
    return positive_list,negative_list

positive_friend, negative_friend = hob(hobbies)
print(f"공통 관심사를 갖는 친구: {positive_friend}")
print(f"공통 관심사가 없는는 친구: {negative_friend}")

 

이렇게 my name의 hobby list를 set으로 바꾸고 hobbies.items()로 각각의 key,value 요소를 불러와서 my hobby list와 set으로 변경한 other_hobbies와의 교집합을 구해 존재한다면 positive list에 존재하지 않는다면 negative list에 append하여 두 개의 

list를 return하는 로직으로 구하였다.


 

이번주부터 파이썬 기초 수업을 들으면서 과제를 처음 풀기 전에는 쉽고 빠르게 할 수 있을 것이라고 생각하였는데 헷갈리고 잘 모르는 개념들이 많았다. 파이썬 기초 문법들과 tuple,list,dictionary,set등 각각 사용하는 방법과 특징들에 대해 좀 더 확실하게 개념을 잡고 가야겠다는 생각이 들었다.

 


본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.