제로베이스 데이터 파트타임 스쿨 학습 일지 [25.04.22]
[강의 요약]
[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일반 강의 자료 일부를 발췌하여 작성되었습니다.”