[12일차] 자료구조 1~2

하은·2023년 11월 2일
0
post-thumbnail

001. 자료구조란?

데이터를 묶어서 관리하자!
파이썬의 다양한 자료구조를 이해하자!

- 자료구조란?

- 여러개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라고 하고, 이러한 컨테이너 자료형의 데이터 구조를 자료구조라 한다.

student1 = '홍길동'
student2 = '박찬호'
student3 = '이용규'
student4 = '박승철'
student5 = '김지은'

-> '홍길동', '박찬호', '이용규', '박승철', '김지은'

: 5개의 변수를 선언해서 따로 관리 -> 묶어서 관리 = 컨테이너 자료형(종류마다 데이터 관리방식, 구조가 약간씩 다르다)

- 다양한 자료구조

- 자료구조는 각각의 컨테이너 자료형에 따라 차이가 있으며, 파이썬의 대표적인 컨테이너 자료형으로는 리스트(List), 튜플(Tuple), 딕셔너리(Dic), 셋트(Set)가 있다.

리스트 : 가장 많이 쓰임. 데이터를 언제든 바꿀 수 있음.
튜플: 리스트와 거의 비슷. 한번 데이터가 정해지면 바꿀 수 없음
딕셔너리: key값과 value값으로 이루어짐
셋트: 중복된 데이터가 존재x

student1 = '홍길동'
student2 = '박찬호'
student3 = '이용규'
student4 = '박승철'
student5 = '김지은' #단일 데이터 ; 변수

students = ['홍길동', '박찬호', '이용규', '박승철', '김지은'] #데이터구분은 , / 컨테이너 안에 데이터가 5개 들어가있다
print(student1)
print(students)
print(type(student1))
print(type(students))

for student in students:
    print(student)

students = ('홍길동', '박찬호', '이용규', '박승철', '김지은') #()
print(type(students))

scores = {'kor':95, 'eng':80, 'mat': 100}
print(type(scores))

allSales = {100, 200, 500, 200}
print(allSales)
print(type(allSales))

-->

홍길동
['홍길동', '박찬호', '이용규', '박승철', '김지은']
<class 'str'>
<class 'list'>

홍길동
박찬호
이용규
박승철
김지은

<class 'tuple'>
<class 'dict'>
{200, 100, 500}
<class 'set'>

002. 리스트(List)

데이터를 줄세우자!

- 리스트(List)란?

- 배열과 같이 여러 개의 데이터를 나열한 자료구조

- 리스트 선언

- '[ ]'를 이용해서 선언하고, 데이터 구분은 ' , '를 이용한다.

student = '홍길동'
print('student: {}'.format(student))
print(type(student))

students = ['홍길동', '박찬호', '이용규', '박승철', '김지은'] 
#리스트 명시위해 []가 나오고, 아이템이 그대로 출력됨
# '김지은' = 아이템(요소)

print('students: {}'.format(students))
print(type(students))

numbers = [10, 20, 30, 40, 50, 60, 70]
print('numbers: {}'.format(numbers))
print(type(numbers))

strs = [3.14, '십', 20, 'one', '3.141592']
# 숫자, 문자(열), 논리형 등 모든 기본데이터를 같이 저장할 수 있다.

print('strs: {}'.format(strs))
print(type(strs))

-->
student: 홍길동
<class 'str'>
students: ['홍길동', '박찬호', '이용규', '박승철', '김지은']
<class 'list'>
numbers: [10, 20, 30, 40, 50, 60, 70]
<class 'list'>
strs: [3.14, '십', 20, 'one', '3.141592']
<class 'list'>
datas = [10, 20, 30, [40, 50, 60]]
# 리스트에 또 다른 컨테이너 자료형 데이터를 저장할 수도 있다.

실습) 가족 이름을 리스트에 저장하고 출력해보자

myFamilyNames = ['기아빠', '윤엄마', '기하은', '기동생']
print(myFamilyNames)

-->
['기아빠', '윤엄마', '기하은', '기동생']

실습) 오늘 일정을 리스트에 저장하고 출력해보자

todaySchedule = ['10시: 업무회의', '12시: 친구와 점약',
                 '3시: 자료정리', '6시: 운동', '9시: 요리']
print(todaySchedule)

-->
['10시: 업무회의', '12시: 친구와 점약', '3시: 자료정리', '6시: 운동', '9시: 요리']

003. 리스트 아이템 조회

리스트의 아이템을 조회하자!

- 인덱스란?

- 아이템에 자동으로 부여되는 번호표

['홍길동', '박찬호', '이용규', '박승철', '김지은']
    0   ,    1   ,    2   ,    3   ,    4
  • 인덱스(index) : 무조건 0부터 시작. 변경불가. pc가 자동부여
  • 하나하나의 데이터에 접근하고 싶을 때 인덱스 사용

- 리스트 아이템은 인덱스를 이용해서 조회가능하다

students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(students[0]) #인덱스이용
print(students[1]) #인덱스이용
print(students[2]) #인덱스이용
print(students[3]) #인덱스이용
print(students[4]) #인덱스이용
print(type(students))
print(type(students[0]))

numbers = [10, 20, 30, 40, 50, 60, 70]
print(numbers[0])
print(type(numbers))
print(type(numbers[0]))

-->
홍길동
박찬호
이용규
박승철
김지은
<class 'list'>
<class 'str'>
10
<class 'list'>
<class 'int'>

실습) 5명의 학생 이름을 리스트에 저장하고 인덱스가 홀수인 학생과 짝수(0포함)인 학생을 구분해서 인덱스와 학생 이름을 출력해보자

students = ['김성예', '신경도', '박기준', '최승철', '황동석']

for i in range(5): #끝까지
    if i % 2 == 0: #짝수
        print('인덱스가 짝수인 경우 - students[{}]: {}'.format(i, students[i]))
    else:
        print('인덱스가 홀수인 경우 - students[{}]: {}'.format(i, students[i]))

-->
인덱스가 짝수인 경우 - students[0]: 김성예
인덱스가 홀수인 경우 - students[1]: 신경도
인덱스가 짝수인 경우 - students[2]: 박기준
인덱스가 홀수인 경우 - students[3]: 최승철
인덱스가 짝수인 경우 - students[4]: 황동석

004. 리스트 길이

리스트의 아이템 개수를 확인하자!

- 아이템 개수

- 리스트 길이란, 리스트에 저장된 아이템 개수를 뜻한다

students = ['김성예', '신경도', '박기준', '최승철', '황동석']
= 리스트 길이: 5

len 함수의 매개변수로 리스트를 씀.
sLength = len(students)

students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(students)

sLength = len(students)
print(sLength)

-->
['홍길동', '박찬호', '이용규', '박승철', '김지은']
5

- len()을 이용한 조회

- len()과 반복문을 이용하면 리스트의 아이템 조회가 가능하다

students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']

sLength = len(students)

* for 문
for i in range(len(students)):
    print(students[i])


* while 문
n = 0
while n < sLength:
    print('n: {}'.format(n))
    print('students[{}] : {}'.format(n, students[n]))
    n += 1

-->
홍길동
박찬호
이용규
박승철
김지은

n: 0
students[0] : 홍길동
n: 1
students[1] : 박찬호
n: 2
students[2] : 이용규
n: 3
students[3] : 박승철
n: 4
students[4] : 김지은

- len()를 이용한 조회

- len()함수는 리스트의 개수뿐만 아니라 문자열의 길이도 알 수 있다

str = 'hello python'
print(len(str))

-->
12

실습) 좋아하는 운동 종목을 리스트에 저장하고 반복문을 이용해서 출력해보자

myFavoriteSports = ['수영', '배구', '조깅', '야구']

# 1
for i in range(len(myFavoriteSports)):
    print(myFavoriteSports[i])

# 2
for item in myFavoriteSports:
    print(item)

# 3
n = 0
while n < len(myFavoriteSports):
    print(myFavoriteSports[n])
    n += 1

-->

수영
배구
조깅
야구

005. 리스트와 for문(1)

for문을 이용해서 리스트 아이템을 참조하자!

- for문을 이용한 조회

- for문을 이용하면 리스트의 아이템을 자동으로 참조할 수 있다.

cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']

# 1
for i in range(len(cars)): #0부터 시작해서 들어가서 조회
    print(cars[i])


# 2
for car in cars: #아이템이 하나씩 들어가서 조회
    print(car)
    
-->
그랜저
소나타
말리부
카니발
쏘렌토

- for문을 이용한 내부 리스트 조회

- for문을 이용하면 리스트의 아이템을 자동으로 참조할 수 있다.

리스트 안에 변수를 두개 주면, 순서대로 값을 가리킴.

studentsCnts = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]

#for i in range(len(studentsCnts)):
#    print('{}학급 학생수: {}'.format(studentsCnts[i][0], studentsCnts[i][1]))

for classNo, cnt in studentsCnts:
    print('{}학급 학생수: {}'.format(classNo, cnt))
    
-->

1학급 학생수: 19
2학급 학생수: 20
3학급 학생수: 22
4학급 학생수: 18
5학급 학생수: 21

실습) 아래 표와 리스트를 이용해서 학급별 학생 수와 전체 학생 수 그리고 평균 학생 수를 출력해보자

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)))

-->
1학급 학생 수: 18
2학급 학생 수: 19
3학급 학생 수: 23
4학급 학생 수: 21
5학급 학생 수: 20
6학급 학생 수: 22
7학급 학생 수: 17
전체 학생 수: 140명
평균 학생 수: 20.0명

006. 리스트와 for문(2)

- for문을 이용한 조회

- for문과 if문을 이용해서 과락 과목 출력하기

minScore = 60

scores = [['국어', 58],
          ['수학', 89],
          ['영어', 77],
          ['과학', 99],
          ['국사', 50]]

# 1 
for item in scores:
    if item[1] < minScore:
        print('과락 과목: {}, 점수: {}'.format(item[0], item[1]))


# 2
for subject, score in scores:
    if score < minScore:
        print('과락 과목: {}, 점수: {}'.format(subject, score))


#3
for subject, score in scores:
    if score >= minScore: continue
    print('과락 과목: {}, 점수: {}'.format(subject, score))

-->

과락 과목: 국어, 점수: 58
과락 과목: 국사, 점수: 50

실습) 사용자가 국어, 영어, 수학, 과학, 국사 점수를 입력하면 과락 과목과 점수를 출력하는 프로그램을 만들어보자

minScore = 60

korScore = int(input('국어 점수: '))
engScore = int(input('영어 점수: '))
matScore = int(input('수학 점수: '))
sciScore = int(input('과학 점수: '))
hisScore = int(input('국사 점수: '))

scores = [['국어', korScore],
          ['영어', engScore],
          ['수학', matScore],
          ['과학', sciScore],
          ['국사', hisScore]]

for subject, score in scores:
    if score < minScore:
        print('과락 과목: {}, 점수: {}'.format(subject, score))
        
-->
국어 점수: 80
영어 점수: 59
수학 점수: 66
과학 점수: 70
국사 점수: 50
과락 과목: 영어, 점수: 59
과락 과목: 국사, 점수: 50

실습) ? 아래의 표와 리스트를 이용해서 학급 학생 수가 가장 작은 학급과 가장 많은 학급을 출력해보자

min = 0
max = 0

classes = [['1학급', 18],
           ['2학급', 19],
           ['3학급', 23],
           ['4학급', 21],
           ['5학급', 20],
           ['6학급', 22],
           ['7학급', 17]]

for classNo, student in classes:
    if student < 18:
        min = student
        print('학생수가 가장 적은 학급(학생수): {}({}명)'.format(classNo, student))
    elif student > 22:
        max = student
        print('학생수가 가장 많은 학급(학생수): {}({}명)'.format(classNo, student))


-->
학생수가 가장 많은 학급(학생수): 3학급(23명)
학생수가 가장 적은 학급(학생수): 7학급(17명)

출력은 했는데 ㅠㅠ 가장 많은, 가장 적은 을 어떻게 표현해야될지 모르겠음

다시 찾아올 것임


변수를 반, 학생수 각각 지정하고,
리스트에 있는 반 학생 수 기준으로 <, > 를 해줘야 하는 거였다
헷갈림
복습필요함

-->

classes = [['1학급', 18],
           ['2학급', 19],
           ['3학급', 23],
           ['4학급', 21],
           ['5학급', 20],
           ['6학급', 22],
           ['7학급', 17]]

minClassNo = 0
maxClassNo = 0
minStudent = 0
maxStudent = 0

for classNo, student in classes:
    if minStudent == 0 or minStudent > student:
        minClassNo = classNo
        minStudent = student

    if maxStudent < student:
        maxClassNo = classNo
        maxStudent = student
print('학생수가 가장 많은 학급(학생수): {}({}명)'.format(maxClassNo, maxStudent))
print('학생수가 가장 적은 학급(학생수): {}({}명)'.format(minClassNo, minStudent))

-->
학생수가 가장 많은 학급(학생수): 3학급(23명)
학생수가 가장 적은 학급(학생수): 7학급(17명)

007. 리스트와 while문(1)

while문을 이용한 리스트 아이템 참조!

- while문을 이용한 리스트의 아이템 조회

- while문을 이용하면 다양한 방법으로 아이템 조회가 가능하다

cars = [['그렌저'], ['소나타'], ['말리부'], ['카니발'], ['쏘렌토']]

# 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

-->
['그렌저']
['소나타']
['말리부']
['카니발']
['쏘렌토']

실습) 아래 표와 리스트를 이용해서 학급별 학생 수와 전체 학생 수그리고 평균 학생 수를 출력해보자

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
    avg = sum / len(studentCnts)
print('전체 학생수: {}명'.format(sum))
print('평균 학생수: {}명'.format(avg))

-->
1학급 학생수: 18명
2학급 학생수: 19명
3학급 학생수: 23명
4학급 학생수: 21명
5학급 학생수: 20명
6학급 학생수: 22명
7학급 학생수: 17명
전체 학생수: 140명
평균 학생수: 20.0명

008. 리스트와 while문(2)

- while문과 if문을 이용해서 과락 과목 출력하기

minScore = 60

scores = [['국어', 58],
          ['수학', 89],
          ['영어', 77],
          ['과학', 99],
          ['국사', 50]]

# 1

n = 0
while n < len(scores):
    if scores[n][1] < minScore:
        print('과락 과목: {}, 점수: {}'.format(scores[n][0], scores[n][1]))
    n += 1


# 2

n = 0
while n < len(scores):
    if scores[n][1] >= minScore:
        n += 1
        continue

    print('과락 과목: {}, 점수: {}'.format(scores[n][0], scores[n][1]))
    n += 1

-->
과락 과목: 국어, 점수: 58
과락 과목: 국사, 점수: 50

실습) while문을 이용해서 사용자가 국어, 영어, 수학, 과학, 국사 점수를 입력하면 과락 과목과 점수를 출력하는 프로그램을 만들어보자

minScore = 60

korScore = int(input('국어 점수: '))
engScore = int(input('영어 점수: '))
matScore = int(input('수학 점수: '))
sciScore = int(input('과학 점수: '))
hisScore = int(input('국사 점수: '))

scores = [['국어', korScore],
          ['영어', engScore],
          ['수학', matScore],
          ['과학', sciScore],
          ['국사', hisScore]]


n = 0
while n < len(scores):
    if scores[n][1] < minScore:
        print('과락 과목: {}, 점수: {}'.format(scores[n][0], scores[n][1]))
    n += 1
    
-->
국어 점수: 80
영어 점수: 69
수학 점수: 66
과학 점수: 70
국사 점수: 50
과락 과목: 국사, 점수: 50

실습) 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))

-->

학생수가 가장 적은 학급(학생수): 7학급 (17명)
학생수가 가장 많은 학급(학생수): 3학급 (23명)

009. enumerate() 함수

인덱스와 아이템을 한번에 조회하자!

- enumerate() 함수

- enumerate() 함수를 이용하면 아이템을 열거할 수 있다.

sports = ['농구', '수구', '축구', '마라톤', '테니스']

# 1
for i in range(len(sports)):
    print('{} : {}'.format(i, sports[i]))


# 2
for idx, value in enumerate(sports): #인덱스값, 아이템
    print('{} : {}'.format(idx, value))
    
-->
0 : 농구
1 : 수구
2 : 축구
3 : 마라톤
4 : 테니스

- enumerate()는 문자열에도 적용할 수 있다.

str = 'hello python'
for idx, value in enumerate(str):
    print('{} : {}'.format(idx, value))

-->
0 : h
1 : e
2 : l
3 : l
4 : o
5 :  
6 : p
7 : y
8 : t
9 : h
10 : o
11 : n

실습) 가장 좋아하는 스포츠가 몇번째에 있는지 출력하는 프로그램을 만들어보자

sports = ['농구', '수구', '축구', '마라톤', '테니스']

favoriteSport = input('가장 좋아하는 스포츠 입력: ')
bestSportIdx = 0

for idx, value in enumerate(sports):
    if value == favoriteSport:
        bestSportIdx = idx + 1 #몇번째 있는지 알 수 있음. 번째니까 +1

print('{}(은)는 {}번째에 있습니다'.format(favoriteSport, bestSportIdx))

-->
가장 좋아하는 스포츠 입력: 마라톤
마라톤(은)는 4번째에 있습니다

실습) 사용자가 입력한 문자열에서 공백의 개수를 출력해보자

message = input('메시지 입력: ')
cnt = 0
for idx, value in enumerate(message):
    if value == ' ':
        cnt += 1

print('공백 개수: {}'.format(cnt))

-->
메시지 입력: 오늘 시간이 빨리 지나갔어요 엉엉
공백 개수: 4

0개의 댓글