※제로베이스 데이터 취업스쿨 11기 수강 중
📗 15일차 공부 내용 요약
파이썬 자료구조(리스트, 튜플, 딕셔니리)에 대한 연습문제를 풀었다
📖 15일차 공부 내용 자세히
※기억에 남는 문제 위주로 남긴다
1. 리스트
Q.다음 리스트에서 중복 아이템(숫자)을 제거하는 프로그램을 만들어보자
'''
numbers : [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
numbers : [22, 8, 9, 5, 2, 7, 1, 3]
'''
#풀이 1
numbers = [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
print(f'numbers : {numbers}')
for n in numbers:
if numbers.count(n) >= 2:
numbers.remove(n)
print(f'numbers : {numbers}')
#풀이 2
idx = 0
while True:
if idx >= len(numbers):
break #인덱스가 끝까지 가면 멈춤
if numbers.count(numbers[idx]) >= 2:
numbers.remove(numbers[idx])
continue #해당 인덱스부터 다시 찾기
idx += 1 #다음 인덱스에서 찾기
print(f'numbers : {numbers}')
Q.4개의 숫자 중 서로 다른 3개를 선택해서 만들 수 있는 모든 경우의 수를 출력하는 프로그램을 만들어보자.
numbers = [4, 6, 7, 9]
result = []
for n1 in numbers:
for n2 in numbers:
if n1 == n2:
continue
for n3 in numbers:
if n1 == n3 or n2 == n3:
continue
result.append([n1, n2, n3])
print(f'result: {result}')
print(f'result length: {len(result)}')
import math
permutation = math.factorial(len(numbers)) / math.factorial((len(numbers) - 3))
print(f'permutation : {int(permutation)}')
2.튜플
Q.다음 2개의 튜플에 대해서 합집합과 교집합을 출력해보자
#풀이 1
tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)
tempHap = list(tuple1)
tempGyo = list()
for n in tuple2:
if n not in tempHap:
tempHap.append(n)
else:
tempGyo.append(n)
tempHap = tuple(sorted(tempHap))
tempGyo = tuple(sorted(tempGyo))
print(f'합집합(중복X)\t : {tempHap}')
print(f'교집합\t\t : {tempGyo}')
#풀이2
tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)
tempHap = tuple1 + tuple2
tempGyo = list()
tempHap = list(tempHap)
for n in tempHap:
if tempHap.count(n) > 1:
tempGyo.append(n)
tempHap.remove(n)
print(f'tempHap : {tempHap}')
print(f'합집합(중복X): {tuple(sorted(tempHap))}')
print(f'tempGyo : {tempGyo}')
print(f'교집합 : {tuple(sorted(tempGyo))}')
Q.다음 튜플의 과일 개수에 대해서 오름차순 및 내림차순으로 정렬해보자.
'''
({'수박': 8}, {'참외': 12}, {'포도': 13}, {'자몽': 15}, {'사과': 17}, {'자두': 19})
({'자두': 19}, {'사과': 17}, {'자몽': 15}, {'포도': 13}, {'참외': 12}, {'수박': 8})
'''
#인덱스를 활용해, 앞쪽에 있는 것들과 비교하면서
#pop을 이용해 떼어내고, insert를 이용해 삽입
fruits = ({'수박':8}, {'포도':13}, {'참외':12}, {'사과':17}, {'자두':19}, {'자몽':15})
fruits = list(fruits)
cIdx = 0; nIdx = 1 #현재 인덱스, 다음 인덱스 => 시작값 셋팅
eIdx = len(fruits) - 1 #마지막 인덱스
flag = True
while flag:
curDic = fruits[cIdx] #현재 과일 딕셔너리
nextDic = fruits[nIdx] #다음 과일 딕셔너리
curDicCnt = list(curDic.values())[0] #현재 딕셔너리 과일 개수, 리스트 형변화
nextDicCnt = list(nextDic.values())[0] #다음 딕셔너리 과일 개수, 리스트 형변환
# 다음 과일 개수가 현재보다 적으면, 그 과일 딕셔너리를 잘라내서, 현재 인덱스 위치에 넣음
if nextDicCnt < curDicCnt:
fruits.insert(cIdx, fruits.pop(nIdx))
# nIdx = cIdx + 1 #자리 바꿈을 했으니, 반복을 초기화 시켜줌
# continue
nIdx += 1
if nIdx > eIdx:
cIdx += 1
nIdx = cIdx + 1
if cIdx == 5:
flag = False
print(tuple(fruits))
Q.학급별 학생 수를 나타낸 튜플을 이용해서, 요구 사항에 맞는 데이터를 출력하는 프로그램을 만들어보자.
#enumerate()와 ietems()를 활용
studentCnt = ({'cls01':18},
{'cls02':21},
{'cls03':20},
{'cls04':19},
{'cls05':22},
{'cls06':20},
{'cls07':23},
{'cls08':17})
totalCnt = 0
minStdCnt = 0; minCls = ''
maxStdCnt = 0; maxCls = ''
deviation = []
for idx, dic in enumerate(studentCnt):
for k, v in dic.items():
totalCnt += v
if idx == 0 or minStdCnt > v:
minStdCnt = v
minCls = k
if maxStdCnt < v:
maxStdCnt = v
maxCls = k
print(f'전체 학생 수: {totalCnt}명')
avgCnt = totalCnt/len(studentCnt)
print(f'평균 학생 수: {round(avgCnt, 2)}명')
print(f'학생 수가 가장 적은 학급: {minCls}({minStdCnt}명)')
print(f'학생 수가 가장 많은 학급: {maxCls}({maxStdCnt}명)')
for idx, dic in enumerate(studentCnt):
for k, v in dic.items():
deviation.append({k:round(v-avgCnt, 2)})
print(f'학급별 학생 편차: {deviation}')
3.딕셔너리
Q.파이썬에서 학생 정보를 가장 효율적으로 저장하고 관리할 수 있는 자료구조를 선택해서 컨테이너 자료형으로 만들어보자.
students = {'S21-0001':{'이름':'최성훈',
'성구분':'M',
'전공':'디자인',
'연락처':'010-1234-5678',
'메일':'hun@gmail.com',
'취미':['농구', '음악']},
'S21-0002': {'이름': '탁영우',
'성구분': 'M',
'전공': '바리스타',
'연락처': '010-5678-9012',
'메일': 'yeong@gmail.com',
'취미': ['축구']},
'S21-0003': {'이름': '황진영',
'성구분': 'W',
'전공': '음악',
'연락처': '010-9012-3456',
'메일': 'jin@gmail.com',
'취미': ['수영', '코딩']}
}
for k1 in students.keys():
print('-' * 40)
print('회원번호 : {}'.format(k1))
student = students[k1] #회원번호에 따른 딕셔너리 저장
for k2 in student.keys():
print('{} : {}'.format(k2, student[k2]))
memNo = input('조회할 회원번호를 입력하세요.: ')
print('{} : {}'.format(memNo, students[memNo]))
➰ 15일차 후기
자료구조 개념을 학습할 때는 무리가 없었는데, 연습문제 풀이를 시작하니 난관에 봉착하는 순간이 많았다;
분명 알고 있던 함수들이었는데도, 문제를 풀 때는 생각이 안나서 더 길게 코드를 작성하고 해설을 보고서야 아!하면서 나 자신의 미련함을 꾸짖기도 햇다.
내용들을 다시 살펴봐야 하는데, 아직 이번주차 진도를 얼른 끝내야해서 조급한 마음이크다ㅜ 당장 다음주에 파이썬 프로그래밍테스트인데~~!!!
그래도 묵묵하게 해보자 라고 다짐해본다,,
※본 내용은 제로베이스 데이터 취업 스쿨에서 제공하는 학습 내용에 기반합니다.
'제로베이스 데이터 스쿨 > 일일 스터디 노트' 카테고리의 다른 글
17일차 스터디노트 / 파이썬 알고리즘(검색, 순위, 정렬, 최댓값,최솟값,최빈값,근삿값) 연습문제 (0) | 2023.01.24 |
---|---|
16일차 스터디노트 / 파이썬 알고리즘(선형검색, 이진검색, 순위, 버블정렬, 삽입정렬, 선택정렬, 재귀, 하노이의 탑, 병합정렬, 퀵정렬) (1) | 2023.01.22 |
14일차 스터디노트 / 파이썬 자료구조, 튜플 자료형과 딕셔너리 자료형의 활용 (1) | 2023.01.18 |
13일차 스터디노트 / 파이썬 자료구조, 리스트 자료형의 활용 (1) | 2023.01.17 |
12일차 스터디노트 / 기초수학 순열, 조합, 확률, 연습문제 풀이 + 파이썬 / 제로베이스 데이터 취업 스쿨 (0) | 2023.01.16 |