[오늘 배운 내용]
[자료구조]
- 여러 개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라 하고, 이 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.
- 컨테이너 자료형: 리스트, 딕셔너리, 튜플, Set
- 튜플은 리스트와 비슷하지만 리스트와는 달리 한 번 데이터가 정해지면 바꿀 수 없음
- 딕셔너리는 key 와 value 값으로 구성
- set은 중복된 데이터가 허용되지 않음.
student1 = '홍길동'
student2 = '박찬호'
student3 = '이용규'
student4 = '박승철'
student5 = '김지은'
# List
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(students)
print(type(students))
for i in students:
print(i)
# 튜플
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(students)
print(type(students))
for i in students:
print(i)
# 딕셔너리
scores = {'kor':95, 'eng':80, 'math':100}
print(scores)
print(type(scores))
# Set
allSales = {100, 200, 500}
print(allSales)
print(type(allSales))
[리스트]
- 배열과 같이 여러 개의 데이터를 나열한 자료구조
- [ ]를 이용해서 선언하고, 데이터 구분은 ,를 이용한다.
- 리스트 안에는 다른 리스트나 데이터 자료구조가 들어갈 수 있음.
students = ['students', '박찬호', '이용규', '이대호', '전준우']
print('students: {}'.format(students))
print(type(students))
# 실습: 가족 이름을 리스트에 저장해보자.
myFamilyNames = ['홍아빠', '홍엄마', '홍길동', '홍동생']
print(myFamilyNames)
todaySchedule = ['9시: 자료구조 공부', '12시: 점심', '5시: 피부과', '7시: 포비기너 회의']
print(todaySchedule)
- 인덱스: 리스트의 아이템에 자동으로 부여되는 번호표 (번호는 0부터 시작)
- 리스트 아이템은 인덱스를 이용해서 조회 가능하다.
# 실습:
students = ['이기제', '김보경', '고명석', '아코스티', '전진우']
for i in range(5):
if i % 2 == 0:
print('인덱스가 짝수인 경우 --> students[{}]: {}'.format(i, students[i]))
else:
print('인덱스가 홀수인 경우 --> students[{}]: {}'.format(i, students[i]))
# len()
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print('length: {}'.format(len(students)))
# len()을 이용한 조회
for i in range(len(students)):
print(students[i])
# len() 함수는 리스트의 개수뿐만 아니라 문자열의 길이도 알 수 있다.
str = 'hello python!!'
print(len(str)) # 공백 포함
# 실습: 좋아하는 운동을 리스트에 저장하고 반복문으로 조회하자.
myFavoriteSports = ['수영', '배구', '야구', '조깅']
# for문
for i in range(len(myFavoriteSports)):
print(myFavoriteSports[i])
# for문 다른 방법
for item in myFavoriteSports:
print(item)
# while문
n = 0
while n < len(myFavoriteSports):
print(myFavoriteSports[n])
n += 1
- for 문을 이용한 리스트 조회
- for 문을 이용하면 리스트의 아이템을 자동으로 참조할 수 있다.
studentCnts = [[1, 19], [2, 20], [3, 21], [4, 22], [5, 23]]
for i in range(len(studentCnts)):
print('{}학급의 학생수: {}'.format(studentCnts[i][0], studentCnts[i][1]))
for classNO, cnt in studentCnts:
print('{}학급의 학생수: {}'.format(classNO, cnt))
------------------------------------------------------------
# 실습1: 학급별 학생 수와 전체 학생 수, 평균 학생 수를 출력하자.
studentsCounts = [[1, 18], [2, 19], [3, 23], [4, 21], [5, 20], [6, 22], [7, 17]]
sumN = 0
for classNo, cnt in studentsCounts:
print('{}학급 학생수: {}'.format(classNo, cnt))
sumN += cnt
averageN = sumN / len(studentsCounts)
print('전체 학생수: {}명'.format(sumN))
print('한 학급 평균 학생수: {}명'.format(averageN))
# 실습2: 사용자가 국어, 영어, 수학, 과학, 국사 점수를 입력하면 과락 과목과 점수를 출력하는 프로그램을 만들어보자.
korScore = int(input('국어 점수 입력: '))
engScore = int(input('영어 점수 입력: '))
mathScore = int(input('수학 점수 입력: '))
sciScore = int(input('과학 점수 입력: '))
hisScore = int(input('국사 점수 입력: '))
minScore = 70
scores= [['국어', korScore],['영어', engScore],['수학', mathScore],['과학', sciScore],['국사', hisScore]]
for item in scores:
if item[1] < 70:
print('과락 과목: {}, 점수: {}'.format(item[0], item[1]))
# 1번
n = 0
while n < len(cars):
print(cars[n])
n += 1
# 2번
n = 0
flag = True
while flag:
print(cars[n])
n += 1
if n == len(cars):
flag = False
# 3번
n = 0
while True:
print(cars[n])
n += 1
if n == len(cars):
break
# 실습1: while과 if문을 이용해서 과락 과목 출력하기
minScore = 60
scores = [['국어', 58],['영어', 77], ['수학', 89], ['과학', 99], ['국사', 50]]
n = 0
while n < len(scores):
if scores[n][1] >= minScore:
n += 1
continue
print('과락 과목: {}, 점수: {}'.format(scores[n][0], scores[n][1]))
n += 1
------------------------------------------------------------
# 실습2: while문을 이용해서 가장 학급 수가 많은 학급과 적은 학급을 출력해보자.
studentCnts = [[1,18], [2,19],[3,23],[4,21],[5,20],[6,22],[7,17]]
minclassNo = 0; maxclassNo = 0
minCnt = 0; maxCnt = 0
n = 0
while n < len(studentCnts):
if minCnt == 0 or minCnt > studentCnts[n][1]:
minclassNo = studentCnts[n][0]
minCnt = studentCnts[n][1]
if maxCnt < studentCnts[n][1]:
maxclassNo = studentCnts[n][0]
maxCnt = studentCnts[n][1]
n += 1
print('학생 수가 가장 적은 학급(학생 수): {}학급({}명)'.format(minclassNo, minCnt))
print('학생 수가 가장 많은 학급(학생 수): {}학급({}명)'.format(maxclassNo, maxCnt))
sports = ['농구', '축구', '야구', '배구', '골프']
for idx, value in enumerate(sports):
print('{}: {}'.format(idx, value))
str = 'hello python.'
for idx, value in enumerate(str):
print('{}: {}'.format(idx, value))
# 실습1: 가장 좋아하는 스포츠가 몇 번째에 있는지 출력
sports = ['축구','야구','골프','농구','배구']
favoriteSport = input('가장 좋아하는 스포츠 입력: ')
mybestSport = 0
for idx, value in enumerate(sports):
if value == favoriteSport:
mybestSport = idx + 1
print('{}(은)는 {}번째에 있습니다.'.format(favoriteSport,mybestSport))
# 실습2 사용자가 입력한 문자열에서 공백의 개수를 출력해보자.
message = input('메시지 입력: ')
blankCnt = 0
for idx, value in enumerate(message):
if value == ' ':
blankCnt += 1
print('문자 공백 개수: {}'.format(blankCnt))
[리스트 아이템 추가]
- append() 함수를 이용하면 마지막 인덱스에 아이템을 추가할 수 있다.
# 1)
students = ['홍길동','박찬호','이용규','이대호','전준우']
students.append('강호동')
print(students)
print(len(students))
# 2)
scores = [['국어', 88], ['영어', 91]]
print('scores: {}'.format(scores))
print('scores length: {}'.format(len(scores)))
scores.append(['수학',96])
print('scores: {}'.format(scores))
print('scores length: {}'.format(len(scores)))
for subject, score in scores:
print('과목: {}, 점수: {}'.format(subject, score))
- insert()함수를 이용하면 특정 위치(인덱스)에 아이템을 추가할 수 있다.
students = ['이대호', '전준우', '한동희', '박세웅', '김원중']
print(students)
students.insert(3, '유강남')
print(students)
# 실습: 오름차순으로 정렬되어 있는 숫자들에 사용자가 입력한 정수를 추가하는 프로그램을 만들어보자. (단, 추가 후에도 오름차순 유지)
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: {}'.format(numbers))
[리스트 아이템 삭제]
- pop() 함수를 이용하면 마지막 인덱스에 해당하는 아이템을 삭제할 수 있다
- pop(n) 함수는 인덱스 n에 해당하는 아이템을 삭제할 수 있다.
students = ['이대호', '전준우', '한동희', '박세웅', '김원중']
print('students: {}'.format(students))
print('students length: {}'.format(len(students)))
rValue = students.pop()
print('rValue: {}'.format(rValue))
students.pop(3)
print('students: {}'.format(students))
print('students length: {}'.format(len(students)))
# 실습: 체조 선수의 점수표에서 최저, 최고 점수를 삭제해보자.
playerScores = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playerScores: {}'.format(playerScores))
minScore = 0; maxScore = 0
minScoreIdx = 0; maxScoreIdx = 0
for idx,score in enumerate(playerScores):
if idx == 0 or minScore > score: # 처음에 idx가 0이면 최저점수는 9.5 그 다음에 idx 1이 되면 최저 점수는 8.9로 교체.
minScoreIdx = idx # 이렇게 가다보면 minScoreIdx와 minScore에는 최저 점수 인덱스와 최저 점수가 들어감.
minScore = score
print('minScore: {}, minScoreIdx: {}'.format(minScore,minScoreIdx))
playerScores.pop(minScoreIdx)
for idx, score in enumerate(playerScores):
if maxScore < score:
maxScoreIdx = idx
maxScore = score
print('maxScore: {}, maxScoreIdx: {}'.format(maxScore,maxScoreIdx))
playerScores.pop(maxScoreIdx)
print('playerScores: {}'.format(playerScores))
- 리스트 특정 아이템 삭제
- remove() 함수를 이용하면 특정 아이템을 삭제할 수 있다.
students = ['이대호', '전준우', '정훈', '안치홍', '한동희', '유강남']
print(students)
students.remove('전준우')
print(students)
- remove()는 한 개의 아이템만 삭제 가능하다. 삭제하려는 데이터가 2개 이상이라면 while문을 이용하자.
students = ['이대호', '전준우', '정훈', '안치홍', '한동희', '유강남', '전준우']
print(students)
while '전준우' in students: # in 이라는 키워드는 리스트 안에 '전준우'라는 데이터가 있으면 True 없으면 False
students.remove('전준우')
print(students)
# 실습: 아래 시험 과목표에서 사용자가 입력한 과목을 삭제하는 프로그램
subjects = ['국어', '영어', '수학', '과학', '국사']
print('시험 과목표: {}'.format(subjects))
removeSubject = input('삭제 과목명 입력: ')
while removeSubject in subjects:
subjects.remove(removeSubject)
print('시험 과목표: {}'.format(subjects))
[리스트 연결(확장)]
- extend() 함수를 이용하면 리스트에 또 다른 리스트를 연결(확장) 할 수 있다.
- 덧셈 연산자를 이용해서 리스트를 연결할 수도 있다.
group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']
print('group1: {}'.format(group1))
print('group2: {}'.format(group2))
# extend
group1.extend(group2)
print('group1: {}'.format(group1))
print('group2: {}'.format(group2))
# 덧셈 연산
result = group1 + group2
print('result: {}'.format(result))
print('group1: {}'.format(group1))
print('group2: {}'.format(group2))
# 실습: 나와 친구가 좋아하는 번호를 합치되 번호가 중복되지 않도록 하는 프로그램 만들기
myFavoriteNumbers = [1, 3, 5, 6, 7]
friendFavoriteNumbers = [2, 3, 5, 8, 10]
print('myFavoriteNumbers: {}'.format(myFavoriteNumbers))
print('friendFavoriteNumbers: {}'.format(friendFavoriteNumbers))
addList = myFavoriteNumbers + friendFavoriteNumbers
print('addList: {}'.format(addList))
result = []
for number in addList:
if number not in result:
result.append(number)
print('result: {}'.format(result))
[리스트 아이템 정렬]
- sort() 함수를 이용하면 아이템을 오름차순 정렬 가능
- sort(reverse=True) 함수를 이용하면 아이템을 내림차순 정렬 가능
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))
# 오름차순
students.sort()
print('students: {}'.format(students))
numbers.sort()
print('numbers: {}'.format(numbers))
# 내림차순
students.sort(reverse=True)
print('students: {}'.format(students))
numbers.sort(reverse=True)
print('numbers: {}'.format(numbers))
# 실습: 점수표에서 최저 및 최고 점수를 삭제한 후 총점과 평균을 출력해보자.
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 playerScore:
sum += score
avg = sum/len(playerScore)
print('총점: %.2f' % sum)
print('평균: %.2f' % avg)
[리스트 아이템 순서 뒤집기]
- reverse() 함수를 이용하면 아이템 순서를 뒤집을 수 있다.
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))
students.reverse()
print('students: {}'.format(students))
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))
numbers.reverse()
print('numbers: {}'.format(numbers))
# 실습: 다음은 전쟁에서 사용되는 암호이다. 암호를 해독하는 프로그램을 만들어보자.
secret = '27156231'
secretList = []
solvedList = ''
for cha in secret:
secretList.append(int(cha))
print('secretList: {}'.format(secretList))
secretList.reverse()
print('secretList: {}'.format(secretList))
val = secretList[0] * secretList[1]
secretList.insert(2, val)
val = secretList[3] * secretList[4]
secretList.insert(5, val)
val = secretList[6] * secretList[7]
secretList.insert(8, val)
val = secretList[9] * secretList[10]
secretList.insert(11, val)
print('secretList: {}'.format(secretList))
[리스트 슬라이싱]
- [n:m]을 이용하면 리스트에서 원하는 아이템만 뽑아낼 수 있다.
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])) # 2부터 -2의 앞에까지
print('students: {}'.format(students[-5 :-2]))
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))
print('numbers: {}'.format(numbers[2:4]))
print('numbers: {}'.format(numbers[:4]))
print('numbers: {}'.format(numbers[2:]))
print('numbers: {}'.format(numbers[2:-2]))
print('numbers: {}'.format(numbers[-5 :-2]))
- [n:m]을 이용하면 문자열도 슬라이싱 가능하다.
- 슬라이싱할 때 단계를 설정할 수 있다. -> [2:-2:2] 2부터 -2 앞까지 중에 2칸씩 띄워서 뽑아낸다.
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers[2:-2:2]))
-> numbers: [0.12, 9, 17]
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))
students[1:4] = ['park chanho', 'lee yonggyu', 'gang hodong']
print('students: {}'.format(students))
- slice()함수를 이용해서 아이템을 슬라이싱 할 수 있다.
-> students[2:4] = students[slice(2,4)]