[제로베이스 데이터 취업스쿨] 23.06.20 스터디 노트

김준호·2023년 6월 20일
0
post-thumbnail

1. 자료구조

  • 여러개의 데이터가 묶여있는 자료형을 컨테이너 자료형 이라고 한다.
  • 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.
  • 대표적인 자료구조
    • 리스트 [] : 데이터 변경 가능
    • 튜플 () : 데이터 변경 불가능
    • 딕셔너리 {} : 키값, 밸류값
    • 세트 {} : 중복 데이터 저장 불가

2. 리스트

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

1) 리스트 선언

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

특징

  • 모든 자료형을 저장 할 수 있다.
  • 리스트에 또 다른 컨테이너 자료형 데이터도 저장 가능하다.

2) 인덱스

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

인덱스를 이용해서 리스트 아이템을 조회 할 수 있다.

실습.

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

for i in range(5):
    if i % 2 == 0:
        print(f'인덱스 짝수: {students[i]}')

    else:
        print(f'인덱스 홀수: {students[i]}')
인덱스 짝수: 김성예
인덱스 홀수: 신경도
인덱스 짝수: 박기준
인덱스 홀수: 최승철
인덱스 짝수: 황동석

3) len()

  • 길이를 알려주는 함수
  • 리스트 길이는 리스트에 저장된 아이템의 갯수를 말한다.
students = ['김성예','신경도','박기준','최승철','황동석']
print(len(students))
5

for문을 이용한 리스트 조회

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

#for문을 리스트 길이만큼 반복
for i in range(len(students)): 
    print(students[i])
print()

#for문을 students 리스트 안의 아이템 수만큼 반복
for item in students:           
    print(item)
박찬호
이용규
홍길동
박승철
김지은

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

4)for문을 이용한 리스트 조회

  • cars = ['제네시스','람보르기니','페라리','카니발','소나타']

1. 인덱스를 이용

for i in range(len(cars)):
    print(f'{cars[i]}')
제네시스
람보르기니
페라리
카니발
소나타

2. 리터러블 객체 이용

for item in cars:
    print(item)
제네시스
람보르기니
페라리
카니발
소나타

리스트 안에 리스트 조회

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

가독성이 떨어진다.

for i in range(len(studentsCnts)):
    print(f'{studentsCnts[i][0]}학급 학생수 : {studentsCnts[i][1]}')
1학급 학생수 : 19
2학급 학생수 : 20
3학급 학생수 : 22
4학급 학생수 : 18
5학급 학생수 : 21

반복문에 변수 2개

for grade,studentCnt in studentsCnts:
    print(f'{grade}학급 학생수 : {studentCnt}')
1학급 학생수 : 19
2학급 학생수 : 20
3학급 학생수 : 22
4학급 학생수 : 18
5학급 학생수 : 21

실습1. for문 if문 사용해 과락 과목 출력하기

과락점수 60점

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

#인덱스를 이용한 방법
for i in scores:
    if i[1] < minScore:
        print(f'과락 과목 : {i[0]}, 점수 : {i[1]}')
print()

#리터러블 객체 이용
for subject, score in scores:
    if score<60:
        print(f'과락 과목 : {subject}, 점수 : {score}')
print()

#continue이용
for subject, score in scores:
    if score>=60: continue
    print(f'과락 과목 : {subject}, 점수 : {score}')
과락 과목 : 국어, 점수 : 58
과락 과목 : 국사, 점수 : 50

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

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

실습2. 최저, 최다 학급 학생수 출력

studentCnts = [[1, 18], [2, 19], [3, 23], [4, 21], [5, 20], [6, 22], [7, 17]]

minCnt = 0; maxCnt = 0
minclassNo =0; maxclassNo = 0

for classNo, cnt in studentCnts:
    if minCnt == 0 or maxCnt > cnt:
        minclassNo = classNo
        minCnt = cnt


    if maxCnt < cnt:
        maxclassNo = classNo
        maxCnt = cnt

print(f'학생수 가장 적은 학급 : {minclassNo}({minCnt}명) ')
print(f'학생수 가장 많은 학급 : {maxclassNo}({maxCnt}명) ')
학생수 가장 적은 학급 : 7(17명) 
학생수 가장 많은 학급 : 3(23명) 

5)while문을 이용한 리스트 조회

cars = ['제네시스','람보르기니','페라리','카니발','소나타']


#while1
n = 0
while n<len(cars):
    print(cars[n])
    n +=1



#while2
n = 0
flag = True
while flag:
    print(cars[n])
    n +=1

    if n == len(cars):
        break


#while3
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:
        print(f'과락 과목 : {scores[n][0]}, 점수 : {scores[n][1]}')
    n+=1
과락 과목 : 국어, 점수 : 58
과락 과목 : 국사, 점수 : 50

실습2. 최저, 최다 학급 학생수 출력

studentsCnts = [[1,18],
                [2,19],
                [3,23],
                [4,21],
                [5,20],
                [6,22],
                [7,17]]

minCnt =0;maxCnt=0
minclassCnt = 0;maxclassCnt = 0

n=0
while n < len(studentsCnts):
    if minCnt == 0 or minCnt > studentsCnts[n][1]:
        minclassCnt = studentsCnts[n][0]
        minCnt = studentsCnts[n][1]

    if maxCnt < studentsCnts[n][1]:
        maxclassCnt = studentsCnts[n][0]
        maxCnt = studentsCnts[n][1]

    n += 1

print(f'학생수 가장 적은 학급 : {minclassCnt}학급 ({minCnt}명)')
print(f'학생수 가장 많은 학급 : {maxclassCnt}학급 ({maxCnt}명)')
학생수 가장 적은 학급 : 7학급 (17명)
학생수 가장 많은 학급 : 3학급 (23명)

6) ⭐enumerate()⭐

  • 인덱스와 아이템을 함께 조회 가능하다.
  • enumerate(조회 할 리스트)
sports = ['농구','수구','축구','마라톤','테니스']

for idx, value in enumerate(sports):
    print(f'{idx} : {value}')
0 : 농구
1 : 수구
2 : 축구
3 : 마라톤
4 : 테니스

enumerate함수는 문자열에서도 사용 가능

message = input('메시지 입력: ')
cnt = 0

for idx, value in enumerate(message):
    if value == ' ':
        cnt+=1

print(f'\' \' 의 갯수 : {cnt}')
메시지 입력: 안녕 나는 홍길동 이라고 해
' ' 의 갯수 : 4

7) append()

  • 리스트에 아이템을 추가 할 떄 사용
  • 마지막 인덱스에 아이템을 추가

실습1.

family = [
    ['아빠',40],
    ['엄마',38],
    ['나',9],
]
print(family)
family.append(['동생',1])

print(f'{family}')
[['아빠', 40], ['엄마', 38], ['나', 9]]
[['아빠', 40], ['엄마', 38], ['나', 9], ['동생', 1]]

8) insert()

  • 리스트의 특정 위치에 아이템 추가
  • insert(추가할 인덱스, 추가할 내용)

실습. 오름차순으로 정렬된 숫자들에 사용자가 입력한 정수 추가

numbers = [1,3,6,11,45,54,62,74,85]

inputNum = int(input('숫자 입력: '))
inputIdx = 0

for idx, num in enumerate(numbers):
    if inputIdx ==0 and inputNum < num:
        inputIdx = idx

numbers.insert(inputIdx,inputNum)
print(numbers)
숫자 입력: 84
[1, 3, 6, 11, 45, 54, 62, 74, 84, 85]

9) pop()

  • pop() ==> 리스트 마지막 아이템 삭제
  • pop(삭제할 인덱스) ==> 해당 인덱스 아이템 삭제

실습.

playerScores = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print(f'playerScores : {playerScores}')

minSco = 0; maxSco = 0
minScoIdx = 0; maxScoIdx = 0

#pop()이용해 최저 점수 삭제
for idx,score in enumerate(playerScores):
    if idx == 0 or minSco > score:
        minScoIdx = idx
        minSco = score
print(f'minScore : {minSco}, minScoreIdx : {minScoIdx}')
playerScores.pop(minScoIdx)

#pop()이용해 최고 점수 삭제
for idx, score in enumerate(playerScores):
    if maxSco < score:
        maxScoIdx = idx
        maxSco = score
print(f'maxSco : {maxSco}, maxScoIdx : {maxScoIdx}')
playerScores.pop(maxScoIdx)

#최저, 최고점 삭제된 점수 리스트
print(f'playerScores : {playerScores}')
playerScores : [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
minScore : 8.8, minScoreIdx : 4
maxSco : 9.8, maxScoIdx : 3
playerScores : [9.5, 8.9, 9.2, 9.0]

10) remove()

  • 리스트의 특정 아이템을 삭제
  • remove()함수는 한번에 하나의 아이템만 삭제 가능, 2개 이상 삭제하려면 while문 사용
  1. while문 사용해 2개이상 아이템 삭제
students = ['홍길동','박찬호','이용규','강호동','박승철','김지은','강호동']
print(students)

while '강호동' in students:        #students 리스트에 '강호동'이 있을 떄 까지
    students.remove('강호동')
    
print(students)
['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은', '강호동']
['홍길동', '박찬호', '이용규', '박승철', '김지은']

11) extend()

  • 리스트에 또 다른 리스트가 추가되어 확장된 리스트로 되는 것.
  • a = [1,2], b =[3,4] --> a.extend(b) --> a=[1,2,3,4], b=[3,4]
group1 = ['홍길동','박찬호','이용규']
group2 = ['강호동','박승철','김지은']
print(group1)
print(group2)

group1.extend(group2)
print(group1)
print(group2)
['홍길동', '박찬호', '이용규']
['강호동', '박승철', '김지은']
['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
['강호동', '박승철', '김지은']

12) 덧셈연산자를 이용한 리스트 연결

  • 덧셈연산자를 이용하면 연결된 새로운 리스트가 생성
group1 = ['홍길동','박찬호','이용규']
group2 = ['강호동','박승철','김지은']

result = group1 + group2
print(group1)
print(group2)
print(result) #group1, group2가 이어진 새로운 result리스트가 생성
['홍길동', '박찬호', '이용규']
['강호동', '박승철', '김지은']
['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

실습1. 내가 좋아하는 숫자, 친구가 좋아하는 숫자 합치되 중보되지 않게 출력

myFavoriteNum = [1,3,5,6,7]
friendFavoriteNum = [2,3,5,8,10]

addList = myFavoriteNum + friendFavoriteNum
print(f'addList : {addList}')

result = []

for num in addList:
    if num not in result:       #중복 숫자 제외
        result.append(num)

print(f'result : {result}')
addList : [1, 3, 5, 6, 7, 2, 3, 5, 8, 10]
result : [1, 3, 5, 6, 7, 2, 8, 10]

13) sort()

  • 오름차순 내림차순으로 정렬해 주는 함수
  • sort() : 오름차순 정렬
  • sort(reverse=True) : 내림차순 정렬
numbers = [2,6,1,59,32,569]
print(numbers)
#오름차순
numbers.sort()
print(numbers)
#내림차순
numbers.sort(reverse=True)
print(numbers)
[2, 6, 1, 59, 32, 569]
[1, 2, 6, 32, 59, 569]
[569, 59, 32, 6, 2, 1]

실습1. 점수표에서 최저, 최고 점수 삭제 후 총점, 평균 출력

playerScores =[9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print(f'playerScore : {playerScores}')

playerScores.sort()
print(f'playerScore : {playerScores}')

playerScores.pop(0)
playerScores.pop(len(playerScores)-1)
print(f'playerScore : {playerScores}')


sum = 0
avg = 0
for score in playerScores:
    sum += score

avg = sum / len(playerScores)

print(f'총점 : {round(sum,2)}')
print(f'평균 : {round(avg,2)}')
playerScore : [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
playerScore : [8.8, 8.9, 9.0, 9.2, 9.5, 9.8]
playerScore : [8.9, 9.0, 9.2, 9.5]
총점 : 36.6
평균 : 9.15

14) reverse()

  • 리스트 아이템 순서 뒤집어 주는 함수

실습1. 전쟁에서 사용되는 암호이다. 해독하는 프로그램 만들어보자.

secret = '27156231'
secretList = []

#암호 문자열을 int로 캐스팅해 리스트로 만들어줄 것.
for cha in secret:
    secretList.append(int(cha))
print(secretList)

#암호를 뒤집기
secretList.reverse()
print(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(f'secretList : {secretList}')
[2, 7, 1, 5, 6, 2, 3, 1]
[1, 3, 2, 6, 5, 1, 7, 2]
secretList : [1, 3, 3, 2, 6, 12, 5, 1, 5, 7, 2, 14]

15) 슬라이싱

  • 원하는 아이템만 뽑아내는 것
  • [n:m] : 인덱스 n번째 부터 인덱스m이전까지 아이템 뽑기
  • [2:4] : 2<=n<4 범위의 아이템 뽑기
students = ['홍길동','박찬호','이용규','강호동','박승철','김지은']
print(students)
print(students[2:4])    #인덱스 2~3까지 아이템만 출력
print(students[:4])     #인덱스 0~3까지
print(students[2:])     #인덱스 2~마지막
print(students[2:-2])   #음수는 마지막 인덱스 부터 시작
print(students[-5:-2])   #음수는 마지막 인덱스 부터 시작
['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
['이용규', '강호동']
['홍길동', '박찬호', '이용규', '강호동']
['이용규', '강호동', '박승철', '김지은']
['이용규', '강호동']
['박찬호', '이용규', '강호동']

슬라이싱 단계 설정

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

#인덱스 1부터 3까지 슬라이싱하고 2개씩 건너뛰면서 출력
print(students[1:4:2])    
['박찬호', '강호동']

슬라이싱 이용해 아이템 변경 가능

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students : {}'.format(students))

#변경할 범위 지정 후 변경 내용 입력
students[1:4] = ['park chanho', 'lee yonggyu', 'gang hodong']
print('students : {}'.format(students))

#변경할 아이템이 슬라이싱한 범위보다 적으면 적은대로 리스트가 감소한다.
students[1:4] = ['박찬호', '이용규']
print('students : {}'.format(students))

#변경할 아이템이 슬라이싱한 범위보다 많으면 많은대로 리스트에 추가된다.
students[1:3] = ['park chanho', 'lee yonggyu', 'gang hodong']
print('students : {}'.format(students))
students : ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students : ['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']
students : ['홍길동', '박찬호', '이용규', '박승철', '김지은']
students : ['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']

slice()함수 이용해 아이템 슬라이싱 가능

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

print('students: {}'.format(students[slice(2, 4)]))
print('students: {}'.format(students[slice(4)]))
print('students: {}'.format(students[slice(2, len(students))]))
students: ['이용규', '강호동']
students: ['홍길동', '박찬호', '이용규', '강호동']
students: ['이용규', '강호동', '박승철', '김지은']
profile
취업공부

0개의 댓글