그동안 열심히 학습한 Tuple() 예제를 풀어보자!
Q >
1,2,3학년 성적은 다음과 같다. 졸업할 때 4.0 이상의 학점을 받기 위해 4학년 1,2학기 최소 학점을 구해보자
for A in 리스트문:
for()을 이용하면 됨scores = (3.7, 4.2), (2.9, 4.3), (4.1, 4.2)
total =0
for s1 in scores:
for s2 in s1:
total =+ s2
total = round(total, 1)
avg = round((total / 6), 1)
print(f'3학년 총학점 : {total}')
print(f'3학년 평균 : {avg}')
grade4TargetScore = round((4.0 * 8 - total), 1)
print(f'4학년 목표 총학점 : {grade4TargetScore}')
minScore = round((grade4TargetScore / 2),1)
print(f'4학년 한학기 최소학점: {minScore}')
scores = list(scores)
scores.append((minScore, minScore))
scores = tuple(scores)
print(f'scores : {scores}')
▼
3학년 총학점 : 4.2
3학년 평균 : 0.7
4학년 목표 총학점 : 27.8
4학년 한학기 최소학점: 13.9
scores : ((3.7, 4.2), (2.9, 4.3), (4.1, 4.2), (13.9, 13.9))
Q >
2개의 튜플을 이용해서 합집합과 교집합을 출력해보자
단, 중복되지 않게
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: # n이 tempHap(=tuple1)에 있는 숫자 1개씩 비교했을때 없다면
tempHap.append(n) # 합집합에 추가
else:
tempGyo.append(n) # 있으면, 교집합 이니까 추가.
tempHap = tuple(sorted(tempHap)) # 오름차순으로 정렬
tempGyo = tuple(sorted(tempGyo))
print(f'합집합(중복 X)\t : {(tempHap)}')
print(f'교집합(중복 X)\t : {(tempGyo)}')
▼
합집합(중복 X) : (0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 17)
교집합(중복 X) : (2, 3, 5, 6, 8)
tuple1 = (1,3,2,6,12,5,7,8)
tuple2 = (0,5,2,9,8,6,17,3)
tempGyo = list()
tempHap = tuple1 + tuple2
tempHap = list(tempHap)
#중복된 데이터 제거 단계
idx = 0 #변수 설정
while True: # 반복해라
if idx >= len(tempHap): # 길이보다 크거나 같으면 더이상 반복할 값이 없으므로
break # 빠져나온다
if tempHap.count(tempHap[idx]) >= 2: #인덱스 갯수가 2개 이상이라면 중복이므로
tempGyo.append(tempHap[idx]) # 공통된 숫자(교집합) 추가
tempHap.remove(tempHap[idx]) # 합집합에는 중복 숫자 제거
continue
idx += 1
print(f'tempHap : {tempHap}')
print(f'tempGyo : {tempGyo}')
print('-'*25)
print(f'tempHap : {tuple(sorted(tempHap))}')
print(f'tempGyo : {tuple(sorted(tempGyo))}')
▼
tempHap : [1, 12, 7, 0, 5, 2, 9, 8, 6, 17, 3]
tempGyo : [3, 2, 6, 5, 8]
-------------------------
tempHap : (0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 17)
tempGyo : (2, 3, 5, 6, 8)
Q >
아이템을 슬라이싱해보자
numbers = (8.7,9.0,9.1,8.6,9.3,7.9,8.1,8.3)
print(f'인덱스 0~3 : {numbers[0:4]}') #3까지 구하고 싶다면 +1로 입력
print(f'인덱스 2~4 : {numbers[2:5]}')
print(f'인덱스 3~끝까지 : {numbers[3:]}')
print(f'인덱스 2 ~ -2 : {numbers[2:-1]}') #뒤에서 2번까지 구하고 싶다면 -1로 입력
print(f'0~끝까지, 3단계 씩 : {numbers[::3]}')
Q > 최소/최대
print(f'최소값 : {min(numbers)}')
print(f'최대값 : {max(numbers)}')
Q > 원하는 숫자의 idx 값
print(f'최소값 idx : {numbers.index(min(numbers))}')
print(f'8.6 idx : {numbers.index(8.6)}')
Q >
점수 입력 후 각 점수별 학점 출력
korScore = int(input('국어 점수 입력 : '))
engScore = int(input('영어 점수 입력 : '))
matScore = int(input('수학 점수 입력 : '))
sciScore = int(input('과학 점수 입력 : '))
hisScore = int(input('국사 점수 입력 : '))
# 짝을 지을거라 Dictionary{} 이용
scores = (
{'kor' : korScore},
{'eng' : engScore},
{'mat' : matScore},
{'sci' : sciScore},
{'his' : hisScore}
)
for item in scores:
for key in item.keys():
if item[key] >= 90:
item[key] = 'A'
elif item[key] >= 80:
item[key] = 'B'
elif item[key] >= 70:
item[key] = 'C'
elif item[key] >= 60:
item[key] = 'D'
else:
item[key] = 'F'
print(scores)
▼
국어 점수 입력 : 91
영어 점수 입력 : 81
수학 점수 입력 : 71
과학 점수 입력 : 61
국사 점수 입력 : 51
({'kor': 'A'}, {'eng': 'B'}, {'mat': 'C'}, {'sci': 'D'}, {'his': 'F'})
Q >
튜플의 과이리 개수에 대해서 오름차순, 내림차순 정렬
# 튜플 선언
fruits = ({'수박':8}, {'포도':13}, {'참외':12}, {'사과':17}, {'자두':19}, {'자몽':15})
# 튜플은 변경이 안되니까, list()로 변경
fruits = list(fruits)
#자리바꿈을 위해서 idx를 알아야 함
cIdx = 0 #현재 인덱스
nIdx = 0 #다음 인덱스
eIdx = len(fruits)-1 #끝의 인덱스 (= 전체 길이 -1)
flag = True
while flag:
# 인덱스를 이용해서 value 값을 뽑아내야 함
curIdx = fruits[cIdx] # 현재 기준이 되는 인덱스
nexIdx = fruits[nIdx] # 비교하게 되는 인덱스
curDicCnt = list(curIdx.values())[0] # 해당 딕셔너리의 과일의 갯수(value값)
nextDicCnt = list(nexIdx.values())[0] # 해당 딕셔너리의 과일의 갯수(value값)
if nextDicCnt < curDicCnt : # 다음 value가 현재 value 보다 작다면
# 오름차순이기 때문에 순서를 바꿔야 한다.
# ex. 참외(nextDicCnt)를 현재 자리(cIdx)인 포도에 넣어야한다, .참외를 잘라서 (pop(nIdx))
fruits.insert(cIdx, fruits.pop(nIdx))
nIdx = cIdx + 1 # 반복을 초기화
continue
nIdx += 1
if nIdx > eIdx: #다음수가 끝수 보다 크면
cIdx += 1 #현재수는 다음수로 넘어와 +1자리에
nIdx = cIdx + 1 #다음수는 현재수보다 항상 +1 크게 존재한다
if cIdx == 5: # 5번까지 반복이 완료되면
flag = False # 끝내라
# list -> tuple
print(tuple(fruits))
▼
({'수박': 8}, {'참외': 12}, {'포도': 13}, {'자몽': 15}, {'사과': 17}, {'자두': 19})
Q >
학급별 학생수, 총인원, 평균, 편차
⭐dic.items( )
items( )메소드를 이용하여 {key:value}쌍을 튜플로 묶어 리스트와 비슷한 자료형으로 만들어서 리턴할 수 있다.
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(): #dic에서 키, 밸류의 아이템들을 구해야 함
totalCnt = totalCnt + v # 반복하면서 밸류(학생수)를 모두 더하면 전체 학생수가 됨
if minStdCnt == 0 or minStdCnt > v: #0으로 처음 시작하거나 학생수가 크다면
minStdCnt = v # 더 작은 밸류가 미니멈이 됨
minCls = k # 적은 학급은 밸류의 짝인 키가 됨
if maxStdCnt < v: # 학생수보다 작다면
maxStdCnt = v # 더 큰 밸류가 맥스가 됨
maxCls = k # 많은 학급은 밸류의 짝인 키가 됨
print(f'전체 학생수 : {totalCnt}')
avgCnt = totalCnt / len(studentCnt)
print(f' 평균 학생수 : {avgCnt}')
print(f'학생수가 가장 적은 학급 : {minCls}({minStdCnt})')
print(f'학생수가 가장 많은 학급 : {maxCls}({maxStdCnt})')
#학급별 편차 구하기
for idx, dic in enumerate(studentCnt):
for k, v in dic.items():
deviation.append(v - avgCnt)
print(f'학급별 학생 편차 : {deviation}')
▼
전체 학생수 : 160
평균 학생수 : 20.0
학생수가 가장 적은 학급 : cls08(17)
학생수가 가장 많은 학급 : cls07(23)
학급별 학생 편차 : [-2.0, 1.0, 0.0, -1.0, 2.0, 0.0, 3.0, -3.0]