[Zerobase][자료구조] Tuple과 Dictionary

솔비·2023년 12월 5일

💻 Python. w/zerobase

목록 보기
17/33
post-thumbnail

파이썬 자료구조(Tuple, Dictionary)


[튜플]

1. 튜플 기본지식

  1. 소괄호()를 이용해서 선언하고 (생략가능), 데이터구분은 ','를 이용한다.
  2. 숫자, 문자열, 논리형 등 모든 기본데이터를 같이 저장할 수 있다.
  3. 튜플에 또 다른 컨테이너 자료형 데이터를 저장 할 수 있다.(튜플안의 튜플)
students = ('홍길동','박찬호','이용규','박승철','김지은')
print(students)				#('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(students[1])			#박찬호
print(type(students))		#<class 'tuple'>
print(type(students[1]))	#<class 'str'>

2. 리스트 vs 튜플

A. 차이점

  • 리스트 : 아이템 조회 추가 변경 삭제 가능하다.
    - append insert extend pop remove 사용가능
  • 튜플 : 아이템 조회는 가능하나, 추가 변경 삭제가 불가하다.
    - 인덱스를 활용한 변경 불가 : 튜플명[idx] = ''
    - append insert extend pop remove 사용불가

B. 리스트<>튜플 변환

리스트와 튜플은 자료형 변환이 가능하다.

  • 리스트 -> 튜플 list()
  • 튜플 -> 리스트 tuple()
students = '박승철','김지은','강호동'
students_list = list(students)

print(students)
print(students_list)
print(type(students))
print(type(students_list))

#('박승철', '김지은', '강호동')
#['박승철', '김지은', '강호동']
#<class 'tuple'>
#<class 'list'>
students = ['박승철','김지은','강호동']
students_list = tuple(students)

print(students)
print(students_list)
print(type(students))
print(type(students_list))

#('박승철', '김지은', '강호동')
#['박승철', '김지은', '강호동']
#<class 'list'>
#<class 'tuple'>

3. 튜플 아이템 조회

A. 인덱스조회

리스트와 동일하게, index로 조회가 가능하고
잘못된 인덱스를 사용하면 error가 발생한다.

#실습
#인덱스가 홀수인 학생과 짝수인 학생을 구분해서 인덱스와 학생이름을 출력해보자

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

for i in range (len(students)) :
    if i % 2 == 0:
        print('[{}] 짝수 : {}'.format(i, students[i]))
    else :
        print('[{}] 홀수 : {}'.format(i, students[i]))

B. for문

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

#방법1
for i in range(len(cars)) :
    print(cars[i])


#방법2
for i in cars : #in 뒤에는 모든 반복가능한 객체(이터러블 객체)가 들어올 수있다.
    print(i)

내부 튜플조회

 students = (1,19),(2,20),(3,22),(4,18),(5,21)

#인덱스
for i in range (len(students)):
    print('{}반 학생 수 : {}'.format(students[i][0],students[i][1]))

#이터러블
for class_no, cnt in students :
    print('{}반 학생 수 : {}'.format(class_no,cnt))
 #실습 학급별 학생 수와 전체 학생 수 그리고 평균 학생 수 출력


#인덱스
students = (1,18),(2,19),(3,23),(4,21),(5,20),(6,22),(7,17)

sum_students = 0
for i in range(len(students)) :
    print('{}반 학생 수 : {}'.format(students[i][0],students[i][1]))
    sum_students += students[i][1]
avg_students = sum_students / len(students)

print('전체학생수 : {}'.format(sum_students))
print('평균학생수 : {}'.format(avg_students))

#이터러블
students = (1,18),(2,19),(3,23),(4,21),(5,20),(6,22),(7,17)

sum_students = 0
for idx,cnt in students :
    print('{}반 학생 수 : {}'.format(idx,cnt))
    sum_students += cnt
avg_students = sum_students / len(students)

print('전체학생수 : {}'.format(sum_students))
print('평균학생수 : {}'.format(avg_students))

C. while문

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

#방법1

n = 0
while n < len(cars) :
    print(cars[n])
    n += 1
    
#방법2
flag = True
n = 0
while flag :
    print(cars[n])
    n+=1

    if n == len(cars) :
        flag = False
        
#방법3
print('-'*30)
n = 0
while True :
    print(cars[n])
    n += 1

    if n == len(cars) :
        break
 #실습 학급별 학생 수 와 전체 학생 수 평균학생수 출력

students = (1,18),(2,19),(3,23),(4,21),(5,20),(6,22),(7,17)

#방법1
n = 0
sum_students = 0
while n < len(students) :
    print('{}학급 학생수 : {}'.format(students[n][0],students[n][1]))
    sum_students += students[n][1]
    n += 1

avg_student = sum_students / len(students)

print('전체 학생 수 : {}'.format(sum_students))
print('평균 학생 수 : {}'.format(avg_student))


#방법2
n = 0
sum_students = 0
while True :
    print('{}학급 학생수 : {}'.format(students[n][0],students[n][1]))
    sum_students += students[n][1]
    n += 1

    if n == len(students) :
        break

avg_student = sum_students / len(students)

print('전체 학생 수 : {}'.format(sum_students))
print('평균 학생 수 : {}'.format(avg_student))
 #실습 학급 수가 가장 작은 학급과 가장 많은 학급

students = (
    (1,18),
    (2,19),
    (3,23),
    (4,21),
    (5,20),
    (6,22),
    (7,17)
)

n=0
max_cnt = 0
max_class = 0
min_cnt = 0
min_class = 0

while n < len(students) :
    if students[n][1] < min_cnt or min_cnt == 0 :
        min_cnt = students[n][1]
        min_class = students[n][0]

    if students[n][1] > max_cnt :
        max_cnt = students[n][1]
        max_class = students[n][0]

    n += 1

print('학생 수가 가장 적은 학급(학생수) : {}학급({}명)'.format(min_class,min_cnt))
print('학생 수가 가장 많은 학급(학생수) : {}학급({}명)'.format(max_class,max_cnt))

4. 튜플 정렬

튜플은 수정이 불가능하기때문에 정렬이 안되지만, 리스트로 변환 후 정렬
sort : 오름차순
sort(reverse = True) : 내림차순

💡 sorted

내장함수 sorted를 사용하면,
튜플 -> 리스트 -> 오름차순정렬 할 수 있다.
즉, 리스트로 반환된다.

students = sorted(students)
print(students)
print(type(students))

#['강호동', '김지은', '박승철', '박찬호', '이용규', '홍길동']
#리스트로 반환됨
#실습 점수표에서 최저 및 최고 점수를 삭제한 후 총점과 평균을 출력해보자

score = 9.5,8.9,9.2,9.8,8.8,9.0
score = sorted(score)		#리스트로변환

score.pop()
score.pop(len(score)-1)

print(score)

sum_score = 0
for i in score :
    sum_score += i

avg_score = sum_score/ len(score)
print(round(sum_score,2))
print(round(avg_score,2))

[딕셔너리]

1. 딕셔너리 기본 지식

  1. 키(key)와 값(value)를 이용해서 자료를 관리한다.
    값은 중복될 수 있으나, 키는 중복될 수 없다.
  2. {}를 이용해서 선언하고, 데이터구분은 ',' , key:value 형태로 아이템을 정의한다.
  3. key : value 하나를 아이템(요소)라고 한다.
  4. key와 value에는 숫자, 문자, 논리형 뿐만 아니라컨테이너 자료형(튜플, 딕셔너리)도 올 수 있다.
    단, key에 immutable(변경이불가능한)값은 올 수있지만 mutable(변경이 가능한)값은 올 수 없다.
    e.g. tuple은 변경이 불가능해서 올 수있으나, list는 변경이 가능하므로 올 수 없다.
  5. 인덱스가 존재하지 않는다.
students = {'s1':'홍길동','s2':'박찬호','s3':'이용규'}
print(students)
print(type(students))

#{'s1': '홍길동', 's2': '박찬호', 's3': '이용규'}
#<class 'dict'>

2. 딕셔너리 조회

인덱스가 없으므로 key값을 이용해서 조회한다.
딕셔너리명[key값]

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

print(students['s1'])		#홍길동
print(students['s2'])		#박찬호
print(students['s3'])		#이용규
print(students['s4'])		#박승철
print(students['s5'])		#['김지은', '박세리']

#딕셔너리 내 list index값
print(students['s5'][0])	#김지은
print(students['s5'][1])	#박세리

A. get()

키 값이 없어도 error가 발생하지 않는다.
*기존의 경우 존재하지 않는 키 값으로 조회 시 error

print(students['s6']) 		 #error
print(students.get('s6'))  # None

B. len()

list, tuple과 마찬가지로 len()함수를 이용해서 아이템의 개수를 파악할 수 있다.

print(len(students))		#5

C.keys() values() items()

  • keys() : 키만 모아줌
  • values() : value만 보아줌
  • items() : key:item = [key,item]
#keys()
subject = scores.keys()
print(subject)
#dict_keys(['kor', 'eng', 'mat', 'sci', 'his'])
print(type(subject))
#<class 'dict_keys'>

score = scores.values()
print(score)
#dict_values([88, 55, 85, 57, 82])
print(type(score))
#<class 'dict_values'>

it = scores.items()
print(it)
#dict_items([('kor', 88), ('eng', 55), ('mat', 85), ('sci', 57), ('his', 82)])
print(type(it))
#<class 'dict_items'>

값만 뽑고싶다면 list로 묶어주자

subject = list(subject)
print(subject)
#['kor', 'eng', 'mat', 'sci', 'his']

score  = list(score)
print(score)
#[88, 55, 85, 57, 82]

it = list(it)
print(it)
#[('kor', 88), ('eng', 55), ('mat', 85), ('sci', 57), ('his', 82)]

📢 list로 변환후에는, for문을 이용한 조회나 enumerate 등으로 조회할 수 있다.

📁 python 실습문제

#실습 60점 미만이면 F(재시험)으로 값을 변경하는 코드를 keys를 이용해서 작성

min_score = 60
fstr = 'F(재시험)'
score = {'kor' : 88,'eng' : 55,'mat' : 85,'sci' : 57,'his' : 82,}

for k in score.keys() :
    if score[k] < min_score :
        score[k] = fstr

    print('과락과목 : {} / 점수 : {}'.format(k,score[k]))

3. 딕셔너리 추가, 수정

A. 딕셔너리 추가

딕셔너리이름[key] = value

#추가
my_info = {}

my_info['이름'] = '박솔비'
my_info['나이'] = '만 25'
my_info['메일'] = 'sb.112097@gmail.com'

print(my_info)
#{'이름': '박솔비', '나이': '만 25', '메일': 'sb.112097@gmail.com'}

📢 주의사항 : 변수는 딕셔너리에 추가될 수 없으므로, key을 만들고 정보를 받아 추가해야한다.

students['name'] = input('이름입력 : ')
students['age'] = input('나이입력 : ')
students['birth'] = input('생년월일입력 : ')

print(students)

B.딕셔너리 수정

만약 기존에 있던 key값을 입력한다면, 수정된다.

my_info = {'이름': '박솔비', '나이': '만 25', '메일': 'sb.112097@gmail.com'}

my_info['메일'] = 'solbe-_-@naver.com'
print(my_info)
#{'이름': '박솔비', '나이': '만 25', '메일': 'solbe-_-@naver.com'}

📁 python 실습문제

#하루에 몸무게(kg)와 신장(m)이 각각 -0.3kg, + 0.001m 씩 변한다고 할떄
#30일 후에 몸무게와 신장의 값을 저장하고 BMI값도 출력하는 프로그램

my_body_info = {'이름':'gildon','몸무게':83.0,'신장':1.80}
my_MBI = my_body_info['몸무게']/(my_body_info['신장'] ** 2 )
print(my_body_info)
print(round(my_MBI,2))

day = 0
while True :
    day += 1
    my_body_info['몸무게'] = round((my_body_info['몸무게'] - 0.3),2)
    my_body_info['신장'] = round((my_body_info['신장'] + 0.001),2)

    if day >= 30 :
        break

my_MBI = round((my_body_info['몸무게']/(my_body_info['신장'] ** 2)),2)
print(my_body_info['몸무게'])
print(my_body_info['신장'])
print(my_MBI)
#0부터 10까지의 각각의 정수에 대한 팩토리얼을 딕셔너리에 추가해보자
#0! = 1

factorial = {}

for i in range(11) :
    if i == 0:
        factorial[i] = 1
    else :
        for j in range (1,i+1) :
            factorial[i] = factorial[i-1] * j

print(factorial)

4. 딕셔너리 삭제

del, pop(), clear()를 사용한다.

A. del 내장함수

del 딕셔너리명[key]

mem_info = {'이름':'홍길동','메일':'gildong@gmail.com','학년':3,'취미':['농구','게임']}
print(mem_info)
#{'이름': '홍길동', '메일': 'gildong@gmail.com', '학년': 3, '취미': ['농구', '게임']}

del mem_info['메일']
print(mem_info)
#{'이름': '홍길동', '학년': 3, '취미': ['농구', '게임']}

B. pop()

딕셔너리명.pop(key)

mem_info = {'이름':'홍길동','메일':'gildong@gmail.com','학년':3,'취미':['농구','게임']}
delete = mem_info.pop('이름')

print(delete)      #홍길동     #반환가능
print(mem_info)
#{'학년': 3, '취미': ['농구', '게임']}

C. Clear()

모든아이템을 삭제한다.

mem_info = {'이름':'홍길동','메일':'gildong@gmail.com','학년':3,'취미':['농구','게임']}
mem_info.clear()

print(mem_info)     #{}

📁python 실습문제

#딕셔너리에 저장된 점수 중 최저 및 최고 점수를 삭제하는 프로그램을 만들어보자

scores = {'scores1':8.9,
'scores2':8.1,
'scores3':8.5,
'scores4':9.8,
'scores5':8.8,
          }

min_score = 0
min_key = 0
max_score = 0
max_key = 0

key = scores.keys()

for i in key :
    if scores[i] < min_score or min_score == 0:
        min_score = scores[i]
        min_key = i

    if scores[i] > max_score :
        max_score = scores[i]
        max_key = i

del scores[max_key]
del scores[min_key]

print(scores)
#{'scores1': 8.9, 'scores3': 8.5, 'scores5': 8.8}

5. 추가기능 (in, not in)

키 존재 유무 판단
딕셔너리 뿐만 아니라 어디서든 사용가능

mem_info = {'이름':'홍길동','메일':'gildong@gmail.com','학년':3,'취미':['농구','게임']}

print('이름'in mem_info)  #True
print('name'in mem_info)  #False

print('이름' not in mem_info)  #False
print('name'not in mem_info)  #True

Zero Base 데이터분석 스쿨
Daily Study Note
profile
Study Log

0개의 댓글