제로베이스 데이터 취업 파트타임/100일 챌린지_일일 학습 일지

제로베이스 데이터 파트타임 스쿨 학습 일지 [25.04.22]

김뚱입니다 2025. 4. 22. 23:13

[강의 요약]

[Part 03. 자료구조&알고리즘 with Python_ Ch 01. 자료구조] 강의 수강

14_리스트 연결부터 19_리스트의 나머지 기능들 (02)까지 강의 수강하였음

🐢 100일 챌린지 🔥 : [▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰░                                       ] 37/100일 (37%)

여기 사람이 죽어가요... 사람 살려...

이건 사람이 할 수 있는 공부가 아니야...

사람이길 포기해야 다 할 수 있어...

 

[오늘의 노동요]

 

 

 

 

[14_리스트 연결]

▶  리스트 연결하는 방법은?

  • list1.extend(list2)
    • list1에 list2 항목을 직접 추가
    • 원본 list1이 변경됨
  • list1 + list2
    • 두 리스트를 새로운 리스트로 반환
    • 원본 유지, 새로운 리스트 생성됨

 

 


▶ 코드 : extend() 함수로 연결

group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']

print('group1: {}'.format(group1))
print('group2: {}'.format(group2))

group1.extend(group2)

print('group1: {}'.format(group1))
print('group2: {}'.format(group2))

[출력 결과]

group1: ['홍길동', '박찬호', '이용규']
group2: ['강호동', '박승철', '김지은']
group1: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
group2: ['강호동', '박승철', '김지은']

 

 

▶ 코드 : + 연산자로 연결 (새 리스트 생성)

group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']

result = group1 + group2

print('group1: {}'.format(group1))
print('group2: {}'.format(group2))
print('result: {}'.format(result))

[출력 결과]

group1: ['홍길동', '박찬호', '이용규']
group2: ['강호동', '박승철', '김지은']
result: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

 

 

▶ 실습 코드 : 중복 없는 숫자 리스트 만들기

myFavoriteNumbers = [1, 3, 5, 6, 7]
friendFavoriteNumbers = [2, 3, 5, 8, 10]

addList = myFavoriteNumbers + friendFavoriteNumbers
print('addList: {}'.format(addList))

result = []
for number in addList:
    if number not in result:
        result.append(number)

print('result: {}'.format(result))

[출력 결과]

addList: [1, 3, 5, 6, 7, 2, 3, 5, 8, 10]
result: [1, 3, 5, 6, 7, 2, 8, 10]

 

 

 

[15_리스트 아이템 정렬]

▶  sort() 함수란?

리스트 내부의 아이템들을 자동으로 정렬해 주는 내장 함수다.

리스트.sort()               # 오름차순 정렬  
리스트.sort(reverse=True)  # 내림차순 정렬

 

리스트 원본이 변경된다. (정렬 후 반환 값없음)

문자열, 숫자 모두 정렬 가능하다.

 

 

▶ 코드 : 이름 정렬 (문자열 리스트)

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))

students.sort()
print('students: {}'.format(students))  # 오름차순

students.sort(reverse=True)
print('students: {}'.format(students))  # 내림차순

[출력 결과]

students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students: ['강호동', '김지은', '박승철', '박찬호', '이용규', '홍길동']
students: ['홍길동', '이용규', '박찬호', '박승철', '김지은', '강호동']

 

 

▶ 코드 : 숫자 정렬 (혼합 숫자 리스트)

numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))

numbers.sort()
print('numbers: {}'.format(numbers))  # 오름차순

numbers.sort(reverse=True)
print('numbers: {}'.format(numbers))  # 내림차순

[출력 결과]

numbers: [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
numbers: [0.12, 1, 2, 3.14, 7, 9, 17, 35, 50, 100]
numbers: [100, 50, 35, 17, 9, 7, 3.14, 2, 1, 0.12]

 

 

▶ 실습 코드 : 최고점과 최저점 제거 후 평균 구하기

playerScore = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playerScore: {}'.format(playerScore))

# 정렬 후 양 끝 제거
playerScore.sort()
print('playerScore: {}'.format(playerScore))

playerScore.pop(0)  # 최저점 제거
playerScore.pop(len(playerScore) - 1)  # 최고점 제거
print('playerScore: {}'.format(playerScore))

# 총점 및 평균 계산
sum = 0
for score in playerScore:
    sum += score

avg = sum / len(playerScore)
print('총점: %.2f' % sum)
print('평점: %.2f' % avg)

[출력 결과]

playerScore: [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
playerScore: [8.8, 8.9, 9.0, 9.2, 9.5, 9.8]
playerScore: [8.9, 9.0, 9.2, 9.5]
총점: 36.60
평점: 9.15

 

 

 

[16_리스트 아이템 순서 뒤집기]

▶  reverse() 함수란?

리스트의 아이템 순서를 뒤집는 내장 함수다.

리스트.reverse()

 

반환값은 없다. (None)

리스트 자체가 역순으로 변경된다.

 

 

▶ 코드 : 학생 리스트 뒤집기

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))

students.reverse()
print('students: {}'.format(students))

[출력 결과]

students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students: ['김지은', '박승철', '강호동', '이용규', '박찬호', '홍길동']

 

 

▶ 코드 : 숫자 리스트 뒤집기

numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))

numbers.reverse()
print('numbers: {}'.format(numbers))

[출력 결과]

numbers: [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
numbers: [3.14, 100, 35, 17, 7, 9, 1, 0.12, 50, 2]

 

 

▶ 실습 코드 : 암호 해독 시뮬레이션

secret = '27156231'
secretList = []
solvedList = ''

# 문자열 → 숫자 리스트로 변환
for cha in secret:
    secretList.append(int(cha))

# 순서 뒤집기
secretList.reverse()
print(secretList)

[출력 결과]

[1, 3, 2, 6, 5, 2, 1, 7]

 

[단계별 값 삽입 (암호 해독 규칙)]

val = secretList[0] * secretList[1]
secretList.insert(2, val)
print(secretList)

val = secretList[3] * secretList[4]
secretList.insert(5, val)
print(secretList)

val = secretList[6] * secretList[7]
secretList.insert(8, val)
print(secretList)

val = secretList[9] * secretList[10]
secretList.insert(11, val)
print(secretList)

[최종 출력]

[1, 3, 3, 2, 6, 12, 5, 2, 10, 1, 7, 7]

각 자릿수를 곱해 중간에 삽입하며 암호를 해독해 나감

insert()reverse()의 조합으로 문제 해결

 

 

 

[17_리스트 슬라이싱]

▶  슬라이싱 문법 정리

리스트[start:end]       # start부터 end-1까지 추출
리스트[start:end:step]  # step 간격으로 추출
  • start 생략 시 0부터
  • end 생략 시 리스트 끝까지
  • step은 몇 칸씩 건너뛸지 (기본값: 1)
  • 음수 인덱스 사용 가능 (-1은 마지막)

 

 

▶ 코드 : 리스트 슬라이싱

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(students[2:4])
print(students[:4])
print(students[2:])
print(students[2:-2])
print(students[-5:-2])

[출력 결과]

['이용규', '강호동']
['홍길동', '박찬호', '이용규', '강호동']
['이용규', '강호동', '박승철', '김지은']
['이용규', '강호동']
['박찬호', '이용규', '강호동']

 

 

▶ 코드 : 숫자 리스트 슬라이싱 + 단계 활용

numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print(numbers[2:-2])
print(numbers[2:-2:2])
print(numbers[:-2:2])
print(numbers[::2])

[출력 결과]

[0.12, 1, 9, 7, 17, 35]
[0.12, 9, 17]
[2, 0.12, 9, 17]
[2, 0.12, 9, 17, 100]

 

 

▶ 코드 : 문자열 슬라이싱

str = 'abcdefghijklmnopqrstuvwxyz'
print('문자열 길이:', len(str))
print(str[2:4])
print(str[:4])
print(str[2:])
print(str[2:-2])
print(str[-5:-2])

[출력 결과]

문자열 길이: 26
cd
abcd
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwx
vwx

 

 

▶ 코드 : 슬라이싱을 이용한 아이템 변경

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

students[1:4] = ['park chanho', 'lee yonggyu', 'gang hodong']
print(students)

students[1:4] = ['박찬호', '이용규']
print(students)

students[1:3] = ['park chanho', 'lee yonggyu', 'gang hodong']
print(students)

[출력 결과]

['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']
['홍길동', '박찬호', '이용규', '박승철', '김지은']
['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']

 

 

▶ 코드 : slice() 객체로 슬라이싱

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

print(students[slice(2, 4)])
print(students[slice(4)])
print(students[slice(2, len(students))])
print(students[slice(2, len(students)-2)])
print(students[slice(len(students)-5, len(students)-2)])

[출력 결과]

['이용규', '강호동']
['홍길동', '박찬호', '이용규', '강호동']
['이용규', '강호동', '박승철', '김지은']
['이용규', '강호동']
['박찬호', '이용규', '강호동']

 

 

 

[18_리스트 나머지 기능들 (01)]

▶  리스트 곱셈 연산 *

리스트에 * 숫자를 하면 해당 리스트가 반복되어 새로운 리스트를 만든다

students = ['홍길동', '박찬호', '이용규']
studentsMul = students * 2
print(studentsMul)

[출력 결과]

['홍길동', '박찬호', '이용규', '홍길동', '박찬호', '이용규']

 

또는 숫자 리스트도 가능하다.

numbers = [2, 50, 0.12, 1, 9]
numbersMul = numbers * 3
print(numbersMul)

[출력 결과]

[2, 50, 0.12, 1, 9, 2, 50, 0.12, 1, 9, 2, 50, 0.12, 1, 9]

 

 

▶ index() 함수: 특정 값의 위치 찾기

students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']

searchIdx = students.index('강호동')
print(searchIdx)  # 출력: 1

searchIdx = students.index('강호동', 2, 6)  # 2~5 범위에서 검색
print(searchIdx)  # 출력: 5

index(값, 시작인덱스, 끝인덱스)처럼 범위 지정 가능하다.

 

숫자 리스트에서도 사용가능하다.

numbers = [2, 50, 0.12, 1, 9, 7, 17, 0.12, 100, 3.14]
print(numbers.index(0.12))        # 출력: 2
print(numbers.index(0.12, 3))     # 출력: 7

 

문자열에서도 사용 가능 하다.

str = '홍길동강호동박찬호이용규박승철강호동김지은'
print(str.index('강호동'))             # 출력: 3
print(str.index('강호동', 10, 20))     # 출력: 21

 

존재하지 않는 값은 ValueError가 발생한다.

print(str.index('ㅎㅎ'))  # 오류 발생!

 

 

▶ 실습 코드 : 행운의 숫자 위치 맞히기

import random

sampleList = random.sample(range(1, 11), 10)  # 1~10까지 중복 없이 섞기

selectIdx = int(input('숫자 7의 위치 입력: '))
searchIdx = sampleList.index(7)

if searchIdx == selectIdx:
    print('빙고!!')
else:
    print('ㅜㅜ')

print('sampleList: {}'.format(sampleList))
print('searchIdx: {}'.format(searchIdx))

[출력 결과]

숫자 7의 위치 입력: 5
빙고!!
sampleList: [1, 3, 7, 10, 5, 2, 6, 8, 4, 9]
searchIdx: 2

 

 

 

[19_리스트 나머지 기능들 (02)]

▶ 코드 : count() 함수: 특정 값의 등장 횟수 세기

students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print('students: {}'.format(students))

searchCnt = students.count('홍길동')
print('searchCnt: {}'.format(searchCnt))

searchCnt = students.count('강호동')
print('searchCnt: {}'.format(searchCnt))

searchCnt = students.count('김아무개')
print('searchCnt: {}'.format(searchCnt))

[출력 결과]

students: ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
searchCnt: 1
searchCnt: 2
searchCnt: 0

 

 

▶ 코드 : del 키워드: 위치/범위 기반 아이템 삭제

students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print('students: {}'.format(students))

del students[1]
print('students: {}'.format(students))

del students[1:4]
print('students: {}'.format(students))

del students[2:]
print('students: {}'.format(students))

[출력 결과]

students: ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
students: ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은']
students: ['홍길동', '박찬호', '김지은']
students: ['홍길동', '박찬호']

 

 

▶ 실습 코드 : 헌혈 데이터 생성 후 혈액형 별 개수를 파악

import random

types = ['A', 'B', 'AB', 'O']
todayData = []
typeCnt = []

for i in range(100):
    type = types[random.randrange(len(types))]
    todayData.append(type)

print('todayData : {}'.format(todayData))
print('todayData length : {}'.format(len(todayData)))

for type in types:
    print('{}형 \t : {}개'.format(type, todayData.count(type)))

[출력 결과]

todayData : ['AB', 'A', 'B', 'O', ..., 'A']
todayData length : 100
A형 	 : 23개
B형 	 : 24개
AB형 	 : 27개
O형 	 : 26개

 

 

[위 코드 이어서. 특정 데이터 전체 제거 (remove() + while 반복)]

while True:
    if todayData.count('O') > 0:
        todayData.remove('O')
    else:
        break

print('todayData : {}'.format(todayData))
print('todayData length : {}'.format(len(todayData)))

for type in types:
    print('{}형 \t : {}개'.format(type, todayData.count(type)))

[출력 결과]

todayData : [... 'AB', 'A', 'B', 'AB', ...]  ← O형이 모두 제거됨
todayData length : 74
A형 	 : 23개
B형 	 : 24개
AB형 	 : 27개
O형 	 : 0개

 

 

 

[나의 생각 정리]

어제에 이어서 오늘도 리스트의 기능들을 정리하는 시간을 가졌다.

백준 문제를 풀면서 리스트를 많이 사용하고 있지만 단번에 경험치를 쌓는 건 쉽지 않은 일

하지만 이렇게 예시 코드를 정리해 두면서 내용을 계속 확인할 수 있어서 좋은 것 같다.

한 번 보고 머리에 사진 넣듯 저장하는 넘사벽의 재능을 가진 사람은 이러지 않아도 되지만...

나는 말하는 감자니까 이렇게 해도 부족함.

 

 

 

[적용점]

백준 문제 풀 때 사용

데이터 EDA 할 때도 사용했던 기억이 있음

최근에 ML DL 프로젝트를 할 일이 없어서 바스러져가고 있는 기억들...

 

 

 

“이 글은 제로베이스 데이터 스쿨 주 3일반 강의 자료 일부를 발췌하여 작성되었습니다.”