18.자료구조와 알고리즘-3

SOWA·2023년 3월 22일
0

─튜플 아이템 정렬

튜플은 수정이 불가하기때문에 리스트로 변환 후 정렬

  • sort()함수를 이용하면 아이템 정렬 가능
  • sorted() 함수를 이용하면 튜플도 정렬 가능
    • sorted()는 리스트 자료형을 반환
    • 튜플 데이터는 그대로 유지한 채 새로운 자료형으로 반환

─튜플과 for문

for문을 이용하면 튜플의 아이템을 자동으로 참조가능

  • for문을 이용하면 튜플 내부에 또 다른 튜플의 아이템 조회 가능
studentsCnt = (1, 19), (2, 20), (3, 22), (4, 18), (5, 21)
for classNo, cnt in studentsCnt:
    print(f'{classNo}학급 학생수: {cnt}')

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

─튜플과 while문

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

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
minScore = 60
scores = ('국어', 58), ('영어', 77), ('수학', 89), ('과학', 99), ('국사', 50)

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

    n += 1

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

🖇️ 딕셔너리(Dictionary)

키(key)와 값(value)를 이용하여 자료 관리
키key가 인덱스 역할을 함
**키는 직접 입력해 주어야 함**

키key는 중복되지 않아야 함. 값value은 중복 되어도 상관없음

  • {}를 이용해서 선언, '키:값'의 형태로 아이템 정의
students = {'s1': '홍길동', 's2': '박찬호', 's3': '이용규', 's4': '박승철', 's5': '김지은',}
  • 키와 값에는 숫자,문자(열), 논리형 뿐만 아니라 컨테이너 자료형도 올 수 있음
  • 단, 키에 immutable 값은 올 수 있지만, mutable 값은 올 수 없음
    • immutable 값 : 변경이 불가능한 데이터 값 ex)상수 , 튜플
    • mutable 값: 변경 가능한 값 ex) 리스트 형

─딕셔너리 조회

딕셔너리는 키를 이용해서 값을 조회
존재하지 않는 키를 조회할시 에러 발생

students = {'s1':'홍길동', 's2': '박찬호', 's3': '이용규', 's4': '박승철', 's5': '김지은',}


print('students[\'s1\']: {}'.format(students['s1']))

students['s1']: 홍길동
  • get(key)를 이용하여 값(value) 조회 가능
    _
students = {'s1':'홍길동', 's2': '박찬호', 's3': '이용규', 's4': '박승철', 's5': '김지은',}
print(students.get('s1'))

홍길동

  • get()은 key가 없어도 에러가 발생하지 않음
print(students.get('s22'))

None

─딕셔너리 추가

  • '딕셔너리 이름[키key]=값value' 형태로 아이템 추가
myInfo = {}

myInfo['이름'] = '박경진'
myInfo['전공'] = 'computer'
myInfo['메일'] = 'jin@naver.com'
myInfo['학년'] = 3
myInfo['주소'] = '대한민국 서울'
myInfo['취미'] = ['요리', '여행']

print(f'myInfo: {myInfo}')

myInfo: {'이름': '박경진', '전공': 'computer', '메일': 'jin@naver.com', '학년': 3, '주소': '대한민국 서울', '취미': ['요리', '여행']}

키 값이 중복이면 기존에 있던 밸류 값이 나중에 입력한 값으로 업데이트 됨

myInfo = {}

myInfo['이름'] = '박경진'
myInfo['전공'] = 'computer'
myInfo['메일'] = 'jin@naver.com'
myInfo['학년'] = 3
myInfo['주소'] = '대한민국 서울'
myInfo['취미'] = ['요리', '여행']

print(f'myInfo: {myInfo}')

myInfo['메일'] = 'jin@gmail.com'
print(f'myInfo: {myInfo}')

myInfo: {'이름': '박경진', '전공': 'computer', '메일': 'jin@naver.com', '학년': 3, '주소': '대한민국 서울', '취미': ['요리', '여행']}
myInfo: {'이름': '박경진', '전공': 'computer', '메일': 'jin@gmail.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}

─딕셔너리 수정

  • '딕셔너리 이름[키key]=값value' 형태로 아이템 수정
#하루에 몸무게(kg)와 신장(m)이 각각 -0.3kg, +0.01m씩 변한다고 할떄, 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('몸무게: {}'.format(myBodyInfo['몸무게']))

    myBodyInfo['신장'] = round((myBodyInfo['신장'] + 0.001), 3)
    print('신장: {}'.format(myBodyInfo['신장']))

    myBMI = myBodyInfo['몸무게'] / (myBodyInfo['신장'] ** 2)

    if date >= 30:
        break


print(f'myInfoBody: {myBodyInfo}')
print(f'myBMI: {myBMI}')

myBodyInfo: {'이름': 'gildong', '몸무게': 83.0, '신장': 1.8}
myBMI: 25.62
몸무게: 82.7
신장: 1.801
몸무게: 82.4
신장: 1.802
몸무게: 82.1
신장: 1.803
몸무게: 81.8
신장: 1.804
몸무게: 81.5
신장: 1.805
몸무게: 81.2
신장: 1.806
몸무게: 80.9
신장: 1.807
몸무게: 80.6
신장: 1.808
몸무게: 80.3
신장: 1.809
몸무게: 80.0
신장: 1.81
몸무게: 79.7
신장: 1.811
몸무게: 79.4
신장: 1.812
몸무게: 79.1
신장: 1.813
몸무게: 78.8
신장: 1.814
몸무게: 78.5
신장: 1.815
몸무게: 78.2
신장: 1.816
몸무게: 77.9
신장: 1.817
몸무게: 77.6
신장: 1.818
몸무게: 77.3
신장: 1.819
몸무게: 77.0
신장: 1.82
몸무게: 76.7
신장: 1.821
몸무게: 76.4
신장: 1.822
몸무게: 76.1
신장: 1.823
몸무게: 75.8
신장: 1.824
몸무게: 75.5
신장: 1.825
몸무게: 75.2
신장: 1.826
몸무게: 74.9
신장: 1.827
몸무게: 74.6
신장: 1.828
몸무게: 74.3
신장: 1.829
몸무게: 74.0
신장: 1.83
myInfoBody: {'이름': 'gildong', '몸무게': 74.0, '신장': 1.83}
myBMI: 22.096807907073963

─keys()와 values()

전체 key와 value를 조회 가능

meInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3}

ks=meInfo.keys()
print(f'ks: {ks}')
print(f'ks:{type(ks)}')

vs=meInfo.values()
print(f'vs: `{vs}')
print(f'vs:{type(vs)}')

items = meInfo.items()
print(f'items: `{items}')
print(f'items:{type(items)}')

ks: dict_keys(['이름', '메일', '학년'])
ks:<class 'dict_keys'>
vs: `dict_values(['홍길동', 'gildong@gmail.com', 3])
vs:<class 'dict_values'>
items: `dict_items([('이름', '홍길동'), ('메일', 'gildong@gmail.com'), ('학년', 3)])
items:<class 'dict_items'>

  • 리스트로 변환
meInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3}

ks = meInfo.keys()
ks = list(ks)
print(f'ks: {ks}')
print(f'ks:{type(ks)}')

vs = meInfo.values()
vs = list(vs)
print(f'vs: `{vs}')
print(f'vs:{type(vs)}')

items = meInfo.items()
items = list(items)
print(f'items: `{items}')
print(f'items:{type(items)}')

ks: ['이름', '메일', '학년']
ks:<class 'list'>
vs: `['홍길동', 'gildong@gmail.com', 3]
vs:<class 'list'>
items: `[('이름', '홍길동'), ('메일', 'gildong@gmail.com'), ('학년', 3)]
items:<class 'list'>

  • for문을 이용한 조회
meInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3}

ks = meInfo.keys()
for key in ks:
    print(f'key: {key}')

for idx, key in enumerate(ks):
    print(f'idx, key: {idx}, {key}')

print('------------------------------')
vs = meInfo.values()
for value in vs:
    print(f'value: {value}')

for idx, key in enumerate(vs):
    print(f'idx, key: {idx}, {value}')


print('------------------------------')
items = meInfo.items()
for item in items:
    print(f'items: {item}')

for idx, key in enumerate(items):
    print(f'idx, item: {idx}, {item}')

key: 이름
key: 메일
key: 학년
idx, key: 0, 이름
idx, key: 1, 메일
idx, key: 2, 학년
------------------------------
value: 홍길동
value: gildong@gmail.com
value: 3
idx, key: 0, 3
idx, key: 1, 3
idx, key: 2, 3
------------------------------
items: ('이름', '홍길동')
items: ('메일', 'gildong@gmail.com')
items: ('학년', 3)
idx, item: 0, ('학년', 3)
idx, item: 1, ('학년', 3)
idx, item: 2, ('학년', 3)

학생 시험점수가 60점 미만이면 'F(재시험)'으로 값을 변경하는 코드를 keys()이용하여 작성


scores = {'kor':88, 'eng':55, 'mat':85, 'sci':57, 'his':82}

print(f'scores: {scores}')

minScore = 60
fStr = 'F(재시험)'
fDic = {} #F맞은 과목만 모아놓은 딕셔너리

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(재시험)'}

─딕셔너리 삭제

  • del과 key를 이용한 item 삭제
 memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3}
print(f'memInfo: {memInfo}')

del memInfo['메일']
print(f'memInfo: {memInfo}')

memInfo: {'이름': '홍길동', '메일': 'gildong@gmail.com', '학년': 3}
memInfo: {'이름': '홍길동', '학년': 3}

  • pop()과 key를 이용한 item 삭제
memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3}
print(f'memInfo: {memInfo}')

returnValue = memInfo.pop('이름')
print(f'memInfo: {memInfo}')
print(f'returnValue: {returnValue}')
print(f'returnValue type: {type(returnValue)}')

returnValue = memInfo.pop('학년')
print(f'memInfo: {memInfo}')
print(f'returnValue: {returnValue}')
print(f'returnValue type: {type(returnValue)}')

memInfo: {'이름': '홍길동', '메일': 'gildong@gmail.com', '학년': 3}
memInfo: {'메일': 'gildong@gmail.com', '학년': 3}
returnValue: 홍길동
returnValue type: <class 'str'>
memInfo: {'메일': 'gildong@gmail.com'}
returnValue: 3
returnValue type: <class 'int'>

딕셔너리에 저장된 점수 중 최저 및 최고 점수를 삭제

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

del scores[minScoreKey]
del scores[maxScoreKey]

print(f'scores:{scores}')

scores:{'score1': 8.9, 'score3': 8.5, 'score5': 8.8}

─ 딕셔너리 유용한 기능들

  • in, not in
    키 존재 유무를 판단

    memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3}
    
    print('이름' in memInfo)
    print('메일' in memInfo)
    print('학년' in memInfo)
    
    
    print('name' not in memInfo)
    print('mail' not in memInfo)
    print('grade' not in memInfo)

    True
    True
    True
    True
    True
    True

  • len()
    딕셔너리의 길이(아이템 개수)를 알 수 있음

    memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3}
    
    print('len(memInfo): {}'.format(len(memInfo)))

    len(memInfo): 3

  • clear()
    모든 아이템 삭제

    memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3}
    
    print('memInfo: {}'.format(memInfo))
    
    memInfo.clear()
    print('memInfo: {}'.format(memInfo))

    memInfo: {'이름': '홍길동', '메일': 'gildong@gmail.com', '학년': 3}
    memInfo: {}


from.제로베이스 데이터 취업스쿨 강의

0개의 댓글