여러 개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라고 하고, 이러한 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.
자료구조는 각각의 컨테이너 자료형에 따라서 차이가 있으며, 파이썬의 대표적인 컨테이너 자료형으로는 리스트(List), 튜플(Tuple), 딕셔너리(Dic), 셋트(Set)가 있다.
리스트란?
# 5명의 학생 이름을 리스트에 저장하고 인덱스가 홀수인 학생과 짝수인 학생을 구분해서 인덱스와 학생 이름을 출력해보자
students = ['김성예', '신경도', '박기준', '최승철', '황동석']
print('--인덱스가 짝수인 학생--')
print('students[0] : {}'.format(students[0]))
print('students[2] : {}'.format(students[2]))
print('students[4] : {}'.format(students[4]))
print('--인덱스가 홀수인 학생--')
print('students[1] : {}'.format(students[1]))
print('students[3] : {}'.format(students[3]))
-----------------------------------------------
#for문을 이용하면
for i in range(5):
if i % 2 ==0:
print('인덱스 짝수 : students[{}] : {}'.format(i, students[i]))
else:
print('인덱스 홀수 : students[{}] : {}'.format(i, students[i]))
# len()과 반복문을 이용하면 리스트의 아이템 조회가 가능하다.
# for문을 이용
for i in range(len(students)):
print('i : {}'.format(i))
print('students[{}] : {}'.format(i, students[i])
---------------------------------------------------
# while문을 이용
n = 0
sLength = len(students)
while n < sLength:
print('n : {}'.format(n))
print('students[{}] : {}'.format(n, students[n]))
i : 0
students[0] : 홍길동
i : 1
students[1] : 박찬호
i : 2
students[2] : 이용규
i : 3
students[3] : 박승철
i : 4
students[4] : 김지은
cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']
for i in range(len(cars)):
print(cars[i])
-----------------------------
for car in cars:
print(car)
>> 똑같은 결과가 나온다.
그랜저
소나타
말리부
카니발
쏘렌토
studentCnts = [[1,19],[2,20],[3,22],[4,18],[5,21]]
for classNo, cnt in studentCnts:
print('{}학급 학생수: {}'.foramt(classNo, cnt)
1학급 학생수: 19
2학급 학생수: 20
3학급 학생수: 22
4학급 학생수: 18
5학급 학생수: 21
**for문을 이용하면, 리스트 내부에 또 다른 리스트의 아이템을 조회할 수도 있다.
# 리스트를 이용해서 학급별 학생 수와 전체 학생 수 그리고 평균 학생수를 출력 (for문 이용)
studentCnts = [[1,18],[2,19],[3,23],[4,21],[5,20],[6,22],[7,17]]
sum = 0
avg = 0
for classNo, cnt in studentCnts:
print('{}학급 학생수: {}'.foramt(classNo, cnt)
sum += cnt
print('전체 학생 수 : {}명'.format(sum))
print('평균 학생 수 : {}명'.format(sum / len(studnetCnts))
# for문과 if문을 이용해서 과락 과목 출력하기
minScore = 60
scores = [
['국어',58],
['영어',77],
['수학',89],
['과학',99],
['국사',50]]
for subject, score in scores:
if score < minScore:
print('과락 과목: {}, 점수 : {}'.format(subject,score))
-------------------------------------
# continue이용
for subject, score in scores:
if score >= minScore: continue
print('과락 과목: {}, 점수: {}'.format(subject, score))
# 리스트를 이용해서 학급 학생 수가 가장 작은 학급과 가장 많은 학급을 출력
studentCnts = [[1, 18], [2, 19], [3, 23], [4, 21], [5, 20], [6, 22], [7, 17]]
minclassNo = 0; maxclassNo = 0
minCnt = 0; maxCnt = 0
for classNo, cnt in studentCnts:
if minCnt == 0 or minCnt > cnt:
minclassNo = classNo
minCnt = cnt
if maxCnt < cnt:
maxclassNo = classNo
maxCnt = cnt
print('학생 수가 가장 적은 학급(학생수): {}학급({}명)'.format(minclassNo, minCnt))
print('학생 수가 가장 많은 학급(학생수): {}학급({}명)'.format(maxclassNo, maxCnt))
cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']
n = 0
while n < len(cars):
print(cars[n])
n+=1
------------------------
n = 0
flag = True
while flag:
print(cars[n])
n+=1
if n == len(cars):
flag = False
------------------------
n = 0
while True:
print(cars[n])
n+=1
if n == len(cars):
break
# 세 개 다 같은 결과가 나온다.
그랜저
소나타
말리부
카니발
쏘렌토
# 리스트를 이용해서 학급별 학생 수와 전체 학생 수 그리고 평균 학생수를 출력 (while문 이용)
studentCnts = [[1,18],[2,19],[3,23],[4,21],[5,20],[6,22],[7,17]]
sum = 0
avg = 0
n = 0
while n < len(studentCnts):
classNo = studentCnts[n][0]
cnt = studentCnts[n][1]
print('{}학급 학생수 : {}명'.format(classNo, cnt))
sum += cnt
n += 1
print('전체 학생 수 : {}명'.format(sum))
print('평균 학생 수 : {}명'.format(sum / len(studnetCnts))
sports = ['농구','수구','축구','마라톤','테니스']
for i in range(len(sports)):
print('{} : {}'.format(i, sports[i]))
--------------------------------------------
for idx, value in enumerate(sports):
print('{} : {}'.format(idx, value))
0 : 농구
1 : 수구
2 : 축구
3 : 마라톤
4 : 테니스
# 가장 좋아하는 스포츠가 몇 번째에 있는지 출력하는 프로그램을 만들어보자
sports = ['농구','수구','축구','마라톤','테니스']
favoriteSport = input('가장 좋아하는 스포츠 입력: ')
bestSportIdx = 0
for idx, value in enumerate(sports):
if value == favoriteSport:
bestSportIdx = idx + 1
print('{}은 {}번째에 있습니다.'.format(favoriteSport, bestSportIdx))
# 가족 구성원의 나이에 새로 태어난 동생을 리스트에 추가해보자
myFamilyAge = [['아빠',40],['엄마',38],['나',9]]
myFamilyAge.append(['동생',1])
for name, age in myFamilyAge:
print('{}의 나이: {}'.format(name, age))
아빠의 나이: 40
엄마의 나이: 38
나의 나이: 9
동생의 나이: 1
words = ['I','a','boy.']
words.insert(1, 'am')
for word in words:
print('{}'.format(word), end='')
I am a boy.
# 오름차순으로 정렬되어 있는 숫자들에 사용자가 입력한 정수를 추가하는 프로그램을 만들어보자. (단, 추가 후에도 오름차순 정렬이 유지되어야 한다.)
numbers = [1,3,6,11,45,54,62,74,85]
inputNumber = int(input('숫자 입력: '))
insertIdx = 0
for idx, number in enumerate(numbers):
print(idx, number)
if insertIdx == 0 and inputNumber < number:
insertIdx = idx
numbers.insert(insertIdx, inputNumber)
print(numbers)
숫자 입력: 55
[1,3,6,11,45,54,55,62,74,85]
# 점수표에서 최고 및 최저 점수를 삭제해보자.
playerScore = [9.5, 8.9, 9.2,9.8, 8.8, 9.0]
print('playerScore : {}'.format(playerScore))
minScore =0; minIdx = 0
maxScore = 0; maxIdx = 0
for idx, score in enumerate(playerScore):
if idx ==0 or minScore > score:
minIdx = idx
minScore = score
print('minScore : {}, minIdx : {}'.format(minScore, minIdx))
playerScore.pop(minIdx)
print('playerScore : {}'.format(playerScore))
for idx, score in enumerate(playerScore):
if maxScore < score:
maxIdx = idx
maxScore = score
print('maxScore : {}, maxIdx : {}'.format(maxScore, maxIdx))
playerScore.pop(maxIdx)
print('playerScore : {}'.format(playerScore))
# 시험 과목표에서 사용자가 입력한 과목을 삭제하는 프로그램
subjects = ['국어', '영어', '수학', '과학', '국사']
print('시험 과목표 : {}'.format(subjects))
removeSubject = input('삭제 과목명 입력:')
while removeSubject in subjects:
subjects.remove(removeSubject)
print('시험 과목표 : {}'.format(subjects))
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
avg = 0
for score in palyerScore:
sum += score
avg = sum / len(playerScore)
print('총점: %2f' %sum)
print('평점: %2f' %avg)
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students : {}'.format(students[2:4]))
print('students : {}'.format(students[:4]))
print('students : {}'.format(students[2:]))
print('students : {}'.format(students[2:-2]))
print('students : {}'.format(students[-5:-2]))
students : ['이용규', '강호동']
students : ['홍길동', '박찬호', '이용규', '강호동']
students : ['이용규', '강호동', '박승철', '김지은']
students : ['이용규', '강호동']
students : ['박찬호', '이용규', '강호동']
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))
print('students: {}'.format(students[2:4]))
print('students: {}'.format(students[:4]))
print('students: {}'.format(students[2:]))
print('students: {}'.format(students[2:-2]))
print('students: {}'.format(students[-5:-2]))
print('students: {}'.format(students[slice(2, 4)]))
print('students: {}'.format(students[slice(4)]))
print('students: {}'.format(students[slice(2, len(students))]))
print('students: {}'.format(students[slice(2, len(students)-2)]))
print('students: {}'.format(students[slice(len(students)-5, len(students)-2)]))
students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students: ['이용규', '강호동']
students: ['홍길동', '박찬호', '이용규', '강호동']
students: ['이용규', '강호동', '박승철', '김지은']
students: ['이용규', '강호동']
students: ['박찬호', '이용규', '강호동']
students: ['이용규', '강호동']
students: ['홍길동', '박찬호', '이용규', '강호동']
students: ['이용규', '강호동', '박승철', '김지은']
students: ['이용규', '강호동']
students: ['박찬호', '이용규', '강호동']
리스트를 곱셈 연산하면 아이템이 반복된다.
index(item) 함수를 item의 인덱스를 알아낼 수 있다.
# 1부터 10까지의 정수가 중복되지 않고 섞여 있을 때 행운의 숫자 7의 위치를 찾자
import random
sampleList = random.sample(range(1,11),10)
selectIdx = int(input('숫자 7의 위치 입력: '))
searchIdx = sampleList.index(7)
if serachIdx == selectIdx:
print('빙고!!')
else:
print('ㅜㅜ')
print('sampleList: {}'.format(sampleList))
print('serachIdx: {}'.foramt(searchIdx))
# 하루동안 헌혈을 진행한 후 혈액형 별 개수를 파악하는 프로그램
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)))
인덱스
studetnsTuple = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
serachName = input('학생 이름 입력: ')
if searchName in studentsTuple:
print('{} 학생은 우리반 학생입니다.'.format(searchName))
else:
print('{} 학생은 우리반 학생이 아닙니다.'.format(searchName))
myFavoriteNumbers = (1, 3, 5, 6, 7)
friendFavoriteNumbers = (2, 3, 5, 8, 10)
print('myFavoriteNumbers: {}'.format(myFavoriteNumbers))
print('friendFavoriteNumbers: {}'.format(friendFavoriteNumbers))
for number in friendFavoriteNumbers:
if number not in myFavoriteNumbers:
myFavoriteNumbers = myFavoriteNumbers + (number, )
print('myFavoriteNumbers: {}'.format(myFavoriteNumbers))
myFavoriteNumbers: (1, 3, 5, 6, 7)
friendFavoriteNumbers: (2, 3, 5, 8, 10)
myFavoriteNumbers: (1, 3, 5, 6, 7, 2, 8, 10)
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students[1:4] = ('park chanho', 'lee yonggyu', 'gang hodong')
print('students : {}'.format(students))
print(type(students))
students : ['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']
<class 'list'>
차이점 :
리스트와 튜플은 자료형 변환이 가능하다.
# 튜플을 이용한 점수표에서 최저 및 최고 점수를 삭제한 후 총점과 평균 출력
playerScore = (9.5, 8.9, 9.2, 9.8, 8.8, 9.0)
print('playerScore: {}'.format(playerScore))
print(type(playerScore))
# 튜플을 리스트로 자료형 변환
playerScore = list(playerScore)
print(type(playerScore))
playerScore.sort()
print('playerScore: {}'.format(playerScore))
playerScore.pop(0)
playerScore.pop(len(playerScore) - 1)
playerScore = tuple(playerScore)
print('playerScore: {}'.format(playerScore))
print(type(playerScore))
sum = 0
avg = 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)
<class 'tuple'>
<class 'list'>
playerScore: [8.8, 8.9, 9.0, 9.2, 9.5, 9.8]
playerScore: (8.9, 9.0, 9.2, 9.5)
<class 'tuple'>
총점: 36.60
평점: 9.15
# 튜플을 이용해서 학급별 학생 수와 전체 학생 수 그리고 평균 학생수를 출력
studentCnts = (1, 18), (2, 19), (3, 23), (4, 21), (5, 20), (6, 22), (7, 17)
sum = 0
avg = 0
for classNo, cnt in studentCnts:
print('{}학급 학생수: {}명'.format(classNo, cnt))
sum += cnt
print('전체 학생 수: {}명'.format(sum))
print('평균 학생 수: {}명'.format(sum / len(studentCnts)))
students = {'s1':'홍길동', 's2':'박찬호', 's3':'이용규', 's4':'박승철', 's5':'김지은'}
print('students[\'s1\']:{}'.format(students['s1']))
print('students[\'s2\']:{}'.format(students['s2']))
print('students[\'s3\']:{}'.format(students['s3']))
print('students[\'s4\']:{}'.format(students['s4']))
print('students[\'s5\']:{}'.format(students['s5']))
students['s1']:홍길동
students['s2']:박찬호
students['s3']:이용규
students['s4']:박승철
students['s5']:김지은
myInfo = {}
myInfo['이름'] = '박경진'
myInfo['전공'] = 'computer'
myInfo['메일'] = 'jin@naver.com'
myInfo['학년'] = 3
myInfo['주소'] = '대한민국 서울'
myInfo['취미'] = ['요리', '여행']
print(f'myInfo : {myInfo}')
myInfo['메일'] = 'gyeongjin@naver.com'
print(f'myInfo : {myInfo}')
myInfo : {'이름': '박경진', '전공': 'computer', '메일': 'jin@naver.com', '학년': 3, '주소': '대한민국 서울', '취미': ['요리', '여행']}
myInfo : {'이름': '박경진', '전공': 'computer', '메일': 'gyeongjin@naver.com', '학년': 3, '주소': '대한민국 서울', '취미': ['요리', '여행']}
# 0부터 10까지의 각각의 정수에 대한 팩토리얼을 딕셔너리에 추가
factorialDic = {}
for i in range(11):
if i == 0:
factorialDic[i] = 1
else:
for j in range(1, (i+1)):
factorialDic[i] = factorialDic[i-1] * j
print(f'factorialDic : {factorialDic}')
factorialDic : {0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120, 6: 720, 7: 5040, 8: 40320, 9: 362880, 10: 3628800}
# 하루에 몸무게와 신장이 각각 -0.3kg, +0.001m씩 변한다고 할 때, 30일 후의 몸무게와 신장의 값을 저장하고 BMI 값도 출력하는 프로그램을 만들어보자
myBodyInfo = {'이름':'gildong', '몸무게':83.0, '신장':1.8}
myBMI = myBodyInfo['몸무게'] / (myBodyInfo['신장'] ** 2)
print(f'myBodyInfo: {myBodyInfo}')
print(f'myBMI: {round(myBMI, 2)}')
date = 0
while True:
date += 1
myBodyInfo['몸무게'] = round((myBodyInfo['몸무게'] - 0.3), 2)
print('몸무게: ', myBodyInfo['몸무게'])
myBodyInfo['신장'] = round((myBodyInfo['신장'] + 0.001), 3)
print('신장: ', myBodyInfo['신장'])
myBMI = myBodyInfo['몸무게'] / (myBodyInfo['신장'] ** 2)
if date >= 30:
break
print(f'myBodyInfo: {myBodyInfo}')
print(f'myBMI: {round(myBMI, 2)}')
myBodyInfo: {'이름': 'gildong', '몸무게': 83.0, '신장': 1.8}
myBMI: 25.62
"---------------------------------------------------------"
myBodyInfo: {'이름': 'gildong', '몸무게': 74.0, '신장': 1.83}
myBMI: 22.1
# 학생의 시험 점수가 60점 미만이면 'F(재시험)'으로 값을 변경하는 코드를 keys()를 이용해서 작성
scores = {'kor':88, 'eng':55, 'mat':85, 'sci':57, 'his':82}
print(f'scores: {scores}')
minScore = 60
fStr = 'F(재시험)'
fDic = {}
for key in scores:
if scores[key] < minScore:
scores[key] = fStr
fDic[key] = fStr
print(f'scores: {scores}')
print(f'fDic: {fDic}')
scores: {'kor': 88, 'eng': 55, 'mat': 85, 'sci': 57, 'his': 82}
scores: {'kor': 88, 'eng': 'F(재시험)', 'mat': 85, 'sci': 'F(재시험)', 'his': 82}
fDic: {'eng': 'F(재시험)', 'sci': 'F(재시험)'}
# 딕셔너리에 저장된 점수 중 최저 및 최고 점수를 삭제하는 프로그램
scores = {'score1':8.9, 'score2':8.1, 'score3':8.5, 'score4':9.8, 'score5':8.8}
minScore = 10; minScoreKey = ''
maxScore = 0; maxScoreKey = ''
for key in scores.keys():
if scores[key] < minScore:
minScore = scores[key]
minScoreKey = key
if scores[key] > maxScore:
maxScore = scores[key]
maxScoreKey = key
print('minScore : {}'.format(minScore))
print('minScoreKey : {}'.format(minScoreKey))
print('maxScore : {}'.format(maxScore))
print('maxScoreKey : {}'.format(maxScoreKey))
del scores[minScoreKey]
del scores[maxScoreKey]
print('scores : {}'.format(scores))
minScore : 8.1
minScoreKey : score2
maxScore : 9.8
maxScoreKey : score4
scores : {'score1': 8.9, 'score3': 8.5, 'score5': 8.8}