Ch1 자료구조 1-19 (자료구조1-4)

김민지·2023년 3월 19일
0
  1. 자료구조란?
  • 컨테이너 자료형 : 여러 개의 데이터가 묶여있는 자료형

  • 자료구조 : 컨테이너 자료형의 데이터 구조

  • 파이썬의 컨테이너 자료형 : 리스트(List), 튜플(Tuple), 딕셔너리(Dic), 셋트(Set)

    List -> students = ['박병찬', '기상호', '성준수', '최종수', '허창현']
    Tuple -> sports = ('농구', '야구', '배구', '골프', '테니스')
    Dic -> scores = {'kor':88, 'eng':91, 'mat':95, 'sci':90, 'his':100}
    Set -> allSales = {100, 150, 90, 110}

  • 튜플은 한 번 데이터가 정해지면 바꿀 수 없음. 리스트는 수정 가능.

  • 딕셔너리는 키값과 그에 해당하는 value값으로 이루어짐

  • 셋트는 중복된 데이터가 허용되지 않음. 리스트는 중복데이터 존재가능.

  1. 리스트
  • 리스트(List) : 배열과 같이 여러 개의 데이터를 나열한 자료구조
    -> 개별 데이터를 하나의 컨테이너로 묶어서 사용
  • 리스트 선언 : '[]' 사용, 아이템(요소) 구분은 ',' 사용
    ex) students = ['박병찬', '기상호', '성준수', '최종수', '허창현']
  • 숫자, 문자(열), 논리형 등 모든 기본 데이터를 같이 저장할 수 있음
    ex) strs = [3.14, '십', 20, 'one']
  • 리스트에 또 다른 컨테이너 자료형 데이터를 저장할 수 있음
    ex) datas = [10, 20, 30, [40, 50, 60]]
  1. 리스트 아이템 조회
  • 인덱스(index) : 아이템에 자동으로 부여되는 번호표
    ex) students = ['박병찬', '기상호', '성준수', '최종수', '허창현']
    -> 앞에서부터 순서대로 0,1,2,3,4의 인덱스가 붙음
  • 리스트 아이템은 인덱스를 이용해서 조회 가능
    ex) print(students[1]) -> '기상호' 출력
    -> 개별적으로 아이템을 조회할 때 type은 각 아이템에 해당되는 게 나옴 (str,int,float..)
  1. 리스트 길이
  • 리스트 길이 : 리스트에 저장된 아이템 개수
    ex) students = ['박병찬', '기상호', '성준수', '최종수', '허창현']
    -> 리스트 길이: 5

    sLength = len(students)
    print(sLength) -> 5

  • len()과 반복문을 이용하면 리스트의 아이템 조회가 가능
students = ['기상호', '박병찬', '최종수', '성준수', '전영중']

for i in range(len(students)):
    print('i : {}'.format(i))
    print('students[{}]: {}'.format(i, students[i]))
students = ['기상호', '박병찬', '최종수', '성준수', '전영중']

n = 0
sLength = len(students)

while n < sLength:
    print('n: {}'.format(n))
    print('students[{}]: {}'.format(n, students[n]))
    n += 1
  • len() 함수는 리스트의 개수뿐 아니라 문자열의 길이도 알 수 있음
str = 'Hello python!!'
print(len(str))      # 공백 포함 계산 -> 14 출력
  1. 리스트와 for문
  • for문을 이용하면 리스트의 아이템을 자동으로 참조할 수 있음
cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']

for i in range(len(cars)):
    print(cars[i])
for car in cars:
    print(car)
  • for문을 이용하면 리스트 내부에 또 다른 리스트의 아이템을 조회할 수 있음
studentCnts = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]

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

-> '1학급 학생 수 : 19' 이런식으로 출력됨

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

for item in scores:
    if item[1] < minScore:
        print('과락 과목: {}, 점수: {}'.format(item[0], item[1]))
for subject, score in scores:
    if score < minScore:
        print('과락 과목: {}, 점수: {}'.format(subject, score))
for subject, score in scores:
    if score >= minScore: continue
          # continue를 만나면 이하 실행문X 다시 반복문으로 돌아감

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

-> 어렵!! 혼자 다시 풀어보기

  1. 리스트와 while문
  • while문을 이용하면 다양한 방법으로 아이템 조회 가능
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
studentsCnts = [
    [1, 18],
    [2, 19],
    [3, 23],
    [4, 21],
    [5, 20],
    [6, 22],
    [7, 17]
]

sum = 0
avg = 0

n = 0
while n < len(studentsCnts):
    classNo = studentsCnts[n][0]
    cnt = studentsCnts[n][1]
    print('{}학급 학생수: {}명'.format(classNo, cnt))
    sum += cnt
    n += 1

avg = int(sum / len(studentsCnts))

print('전체 학생 수: {}명'.format(sum))
print('평균 학생 수: {}명'.format(avg))
minScore = 60

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

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

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

    print('과락 과목: {}, 점수: {}'.format(scores[n][0], scores[n][1]))
    n += 1
studentCnts = [
    [1, 18],
    [2, 19],
    [3, 23],
    [4, 21],
    [5, 20],
    [6, 22],
    [7, 17]
]

minClassNo = 0; minStuCnt = 0
maxClassNo = 0; maxStuCnt = 0

n = 0
while n < len(studentCnts):
    if minStuCnt == 0 or minStuCnt > studentCnts[n][1]:
        minStuCnt = studentCnts[n][1]
        minClassNo = studentCnts[n][0]
    if maxStuCnt < studentCnts[n][1]:
        maxStuCnt = studentCnts[n][1]
        maxClassNo = studentCnts[n][0]
    n += 1

print('학생 수가 가장 적은 학급(학생수): {}학급({}명)'.format(minClassNo, minStuCnt))
print('학생 수가 가장 많은 학급(학생수): {}학급({}명)'.format(maxClassNo, maxStuCnt))
  1. enumerate() 함수
  • enumerate() -> 아이템 열거 가능. 각 아이템의 인덱스를 알려줌 (idx, value 순으로)
sports = ['농구', '수구', '축구', '마라톤', '테니스']

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

for idx, value in enumerate(sports):
    print('{} : {}'.format(idx, value))       #위와 똑같은 결과가 나옴
  • enumerate()는 리스트뿐 아니라 '문자열'도 열거 가능
str = 'Hello python.'

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

-> 각 문자열(공백포함)을 하나하나 순서대로 인덱스를 알려줌

  • 입력한 문자가 리스트 몇 번째에 있는지 출력하기
sports = ['농구', '수구', '축구', '마라톤', '테니스']
favoriteSport = input('가장 좋아하는 스포츠 입력: ')

favoriteSportIdx = 0

for idx, value in enumerate(sports):
    if value == favoriteSport:
        favoriteSportIdx = idx + 1      # 인덱스는 0부터 시작하기 때문에 1을 더해줌

print('{}는 {}번째에 있습니다.'.format(favoriteSport, favoriteSportIdx))
  • 공백 개수 출력하기
message = input('메시지 입력: ')
cnt = 0
for idx, value in enumerate(message):
    if value == ' ':
        cnt += 1

print('공백 개수: {}'.format(cnt))
  1. 리스트에 아이템 추가
  • append() 함수 : 마지막 인덱스에 아이템 추가
students = ['기상호', '박병찬', '최종수', '성준수', '전영중']
students.append('허창현')

-> 리스트의 길이(len)와 (추가된)마지막 아이템의 인덱스가 1 증가됨

scores = [['국어', 88], ['영어', 91]]
scores.append(['수학', 96])
  • insert() 함수 : 특정 위치에 아이템 추가하기 -> 지정한 인덱스에 추가됨
students = ['기상호', '박병찬', '최종수', '성준수', '전영중']
students.insert(3, '허창현')

-> ['기상호', '박병찬', '최종수', '허창현', '성준수', '전영중']
-> '허창현'이 인덱스3에 들어가고 뒤에 아이템들은 하나씩 인덱스가 밀림(늘어남)

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에는 딱 한번만 들어오고 끝남 (0일때만 if문을 하도록 설정했기때문)
        insertIdx = idx
       # 입력한 숫자가 number보다 작아지는 때, 그 자리를 차지함
       
numbers.insert(insertIdx, inputNumber)
print(numbers)
  1. 리스트의 아이템 삭제
  • pop() 함수 : 마지막 인덱스에 해당하는 아이템 삭제
    ex) students.pop()
  • pop(n) : 인덱스가 n에 해당하는 아이템 삭제
    ex) students = ['기상호', '박병찬', '최종수', '성준수', '전영중']
    students.pop(3) -> '성준수' 삭제
    -> 뒤의 아이템들은 앞으로 1씩 땡겨짐(인덱스가 1씩 줄음)
  • 삭제한 아이템을 반환할 수 있음
    ex) rValue = students.pop()
    print(rValue) -> 삭제한 아이템이 출력됨
scores = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playerScore : {}'.format(scores))

minScore = 0; minScoreIdx = 0
maxScore = 0; maxScoreIdx = 0

for idx, score in enumerate(scores):
    if minScore == 0 or score < minScore:
        minScore = score
        minScoreIdx = idx
print('minScore : {}, minScoreIdx : {}'.format(minScore, minScoreIdx))
scores.pop(minScoreIdx)

for idx, score in enumerate(scores):
    if score > maxScore:
        maxScore = score
        maxScoreIdx = idx


print('maxScore : {}, maxScoreIdx : {}'.format(maxScore, maxScoreIdx))
scores.pop(maxScoreIdx)

print('playerScore : {}'.format(scores))

-> 최저점수와 최고점수를 찾아내서 삭제하기

  • remove() 함수 : 특정 아이템 삭제
students = ['기상호', '박병찬', '성준수', '최종수', '허창현', '전영중']
students.remove('최종수')

-> remove()에 삭제시킬 아이템을 직접 입력해서 삭제함

  • remove()는 (동일한 아이템이 몇 개 있을 때) 한 번에 한 개의 아이템만(앞에 있는 아이템) 삭제 가능. 만약 두 개 이상 삭제하려면 while문 이용.
while '최종수' in students:          # 해당 아이템이 리스트에 들어있는(in) 한 삭제반복
    students.remove('최종수')
myList = ['마케팅 회의', '회의록 정리', '점심 약속', '월간 업무 보고', '치과 방문', '마트 장보기']
print('일정 : {}'.format(myList))

removeItem = input('삭제 대상 입력: ')
myList.remove(removeItem)

print('일정 : {}'.format(myList))
subjects = ['국어', '영어', '수학', '과학', '국사']
print('시험 과목표 : {}'.format(subjects))

removeSubject = input('삭제 과목명 입력: ')
while removeSubject in subjects:          # 리스트에 아이템이 중복이 있는지 없는지 상관없이 써도, 중복 아이템을 모두 삭제시켜 줘서 편리
    subjects.remove(removeSubject)

print('시험 과목표 : {}'.format(subjects))
  1. 리스트 연결
  • extend() 함수 : 리스트에 또 다른 리스트를 연결(확장)
  • 덧셈 연산자(+)로도 리스트 연결 가능
    -> extend()는 1에 2가 더해져서 1이 확장되는 개념, 덧셈연산자는 새로운 리스트가 만들어지는 개념
group1 = ['기상호', '성준수', '진재유', '박병찬']
group2 = ['전영중', '최종수', '주찬양', '최종수']

group1.extend(group2)

-> group2는 영향 없음. group1만 바뀜(확장됨)

result = group1 + group2

-> 새로운 리스트가 만들어짐. 기존의 group1,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:    # addList에서 result로 아이템을 복사하는 과정에서 '중복 아이템'을 배제하기 위함
        result.append(number)

print('result: {}'.format(result))
  1. 리스트 아이템 정렬
  • sort() 함수 : 아이템 정렬 (기본 오름차순, sort(reverse=True): 내림차순)
  • 문자열, 숫자 정렬 가능
students = ['박병찬', '전영중', '기상호', '허창현', '성준수', '최종수']
print('students: {}'.format(students))

students.sort()                      # 오름차순 (ㄱ,ㄴ,ㄷ..)
print('students: {}'.format(students))

students.sort(reverse=True)          # 내림차순
print('students: {}'.format(students))
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()    # 최고 점수 삭제   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)
  1. 리스트 아이템 순서 뒤집기
  • reverse() 함수 : 아이템 순서 뒤집기 (순서를 뒤에서부터 나열)
students = ['기상호', '박병찬', '성준수', '최종수', '허창현', '전영중']
students.reverse()
print(students)

-> ['전영중', '허창현', '최종수', '성준수', '박병찬', '기상호']

secret = '27156231'
secretList = []

for cha in secret:           
    secretList.append(int(cha))  # int() 안 하면, 문자열로 넣음
print(secretList)              # [2, 7, 1, 5, 6, 2, 3, 1]
  1. 리스트 슬라이싱
  • [n:m] : 리스트에서 원하는 아이템만 뽑아낼 수 있음
  • 인덱스 n부터 m 바로 앞까지의 아이템만 뽑아냄 (n<=아이템<m)
    -> n부터 m-1의 인덱스 아이템만 추출
students = ['박병찬', '기상호', '성준수', '최종수', '허창현']
print('students: {}'.format(students[2:4]))   # ['성준수','최종수']
  • students[:4] -> 처음(인덱스0)부터 인덱스3까지 추출
  • students[2:] -> 인덱스2부터 마지막까지 추출
  • students[2:-1] -> 음수는 뒤에서부터 -1,-2 순으로 계산함
    -> 리스트로 추출됨
  • [n:m]으로 문자열 슬라이싱도 가능 -> 문자열로 추출됨
  • 단계 설정 가능 [n:m:단계]
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers[2:-2]))
print('numbers: {}'.format(numbers[2:-2:2]))
print('numbers: {}'.format(numbers[:-2:2]))
print('numbers: {}'.format(numbers[::2]))
  • 출력결과
numbers: [0.12, 1, 9, 7, 17, 35]
numbers: [0.12, 9, 17]
numbers: [2, 0.12, 9, 17]
numbers: [2, 0.12, 9, 17, 100]
  • 슬라이싱을 이용해 아이템 변경 가능
students = ['최종수', '기상호', '박병찬', '성준수', '주찬양']
print('students: {}'.format(students))

students[1:4] = ['Ki Sang Ho', 'Park Byung Chan', 'Sung Jun Su']
print('studnets: {}'.format(students))

-> 슬라이싱해서 없애고 그 자리에 아이템 리스트 대체

  • slice() 함수로도 슬라이싱 가능
    ex) slice(2, 4) -> 인덱스 2부터 4-1(3)까지 추출
    slice(4) -> 처음부터 인덱스3까지 추출
    slice(2, len(students)) -> 인덱스2부터 끝까지 추출
  1. 리스트 나머지 기능들
  • 리스트를 곱셈 연산하면 곱한 숫자만큼 아이템이 반복됨 (숫자 아이템도 마찬가지)
students = ['박병찬', '기상호', '성준수']
print(students * 2)     # ['박병찬', '기상호', '성준수', '박병찬', '기상호', '성준수']
  • index(item) 함수 : item의 인덱스를 알아낼 수 있음
students = ['박병찬', '기상호', '성준수', '최종수', '주찬양', '성준수']
print(students.index('성준수'))    # 2

-> 중복 아이템이 있어도 앞쪽 아이템부터 찾고 끝냄.

  • 찾는 아이템의 범위를 정해줄 수 있음
students = ['박병찬', '기상호', '성준수', '최종수', '주찬양', '성준수']

print(students.index('성준수', 3, 6))   # 인덱스 3부터 5까지 범위에서 찾기 -> 5
  • 숫자 7 위치 맞히기
import random

sampleList = random.sample(range(1, 11), 10)   # 범위 1~10 숫자중 10개 중복없이 추출 (순서랜덤)

selectIdx = int(input('숫자 7의 위치 입력: '))
searchIdx = sampleList.index(7)    # 7의 위치(인덱스)

if searchIdx == selectIdx:
    print('빙고!!')
else:
    print('ㅜㅜ')

print('sampleList: {}'.format(sampleList))
print('sampleIdx: {}'.format(searchIdx))
  • count() 함수 : 특정 아이템의 개수를 알아낼 수 있음 (없으면 0)
students = ['박병찬', '기상호', '성준수', '박병찬', '기상호', '박병찬']
print(students.count('박병찬'))      # 3
  • del 키워드 : 특정 아이템 삭제 가능 (인덱스 지정)
del students[2]       # 인덱스 2의 아이템 삭제
print(students)       # ['박병찬', '기상호', '박병찬', '기상호', '박병찬']
del students[1:4]     # 인덱스 1부터 3까지 삭제
print(students)       # ['박병찬', '기상호', '박병찬']
import random

types = ['A', 'B', 'AB', 'O']
todayData = []

for i in range(100):
    type = types[random.randrange(len(types))]   # len(types):4 -> 0~3 중 하나 랜덤 -> types[0~3] 랜덤으로 혈액형 뽑아냄
    todayData.append(type)    # 100번 랜덤으로 todayData에 아이템을 뽑아 넣음

print('todayData: {}'.format(todayData))
print('todayData length: {}'.format(len(todayData)))

for type in types:
    print('{}형 \t : {}개'.format(type, todayData.count(type)))  # 혈액형 각각의 개수를 셈

<제로베이스 데이터 취업 스쿨>

0개의 댓글