
- 소괄호()를 이용해서 선언하고 (생략가능), 데이터구분은 ','를 이용한다.
- 숫자, 문자열, 논리형 등 모든 기본데이터를 같이 저장할 수 있다.
- 튜플에 또 다른 컨테이너 자료형 데이터를 저장 할 수 있다.(튜플안의 튜플)
students = ('홍길동','박찬호','이용규','박승철','김지은')
print(students) #('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(students[1]) #박찬호
print(type(students)) #<class 'tuple'>
print(type(students[1])) #<class 'str'>
- 리스트 : 아이템 조회 추가 변경 삭제 가능하다.
- append insert extend pop remove 사용가능- 튜플 : 아이템 조회는 가능하나, 추가 변경 삭제가 불가하다.
- 인덱스를 활용한 변경 불가 : 튜플명[idx] = ''
- append insert extend pop remove 사용불가
리스트와 튜플은 자료형 변환이 가능하다.
- 리스트 -> 튜플 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'>
리스트와 동일하게, index로 조회가 가능하고
잘못된 인덱스를 사용하면 error가 발생한다.
#실습
#인덱스가 홀수인 학생과 짝수인 학생을 구분해서 인덱스와 학생이름을 출력해보자
students = ('홍길동','박찬호','이용규','박승철','김지은')
for i in range (len(students)) :
if i % 2 == 0:
print('[{}] 짝수 : {}'.format(i, students[i]))
else :
print('[{}] 홀수 : {}'.format(i, students[i]))
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))
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))
튜플은 수정이 불가능하기때문에 정렬이 안되지만, 리스트로 변환 후 정렬
sort : 오름차순
sort(reverse = True) : 내림차순
내장함수 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))
- 키(key)와 값(value)를 이용해서 자료를 관리한다.
값은 중복될 수 있으나, 키는 중복될 수 없다.- {}를 이용해서 선언하고, 데이터구분은 ',' , key:value 형태로 아이템을 정의한다.
- key : value 하나를 아이템(요소)라고 한다.
- key와 value에는 숫자, 문자, 논리형 뿐만 아니라컨테이너 자료형(튜플, 딕셔너리)도 올 수 있다.
단, key에 immutable(변경이불가능한)값은 올 수있지만 mutable(변경이 가능한)값은 올 수 없다.
e.g. tuple은 변경이 불가능해서 올 수있으나, list는 변경이 가능하므로 올 수 없다.- 인덱스가 존재하지 않는다.
students = {'s1':'홍길동','s2':'박찬호','s3':'이용규'}
print(students)
print(type(students))
#{'s1': '홍길동', 's2': '박찬호', 's3': '이용규'}
#<class 'dict'>
인덱스가 없으므로 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]) #박세리
키 값이 없어도 error가 발생하지 않는다.
*기존의 경우 존재하지 않는 키 값으로 조회 시 error
print(students['s6']) #error
print(students.get('s6')) # None
list, tuple과 마찬가지로 len()함수를 이용해서 아이템의 개수를 파악할 수 있다.
print(len(students)) #5
- 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 등으로 조회할 수 있다.
#실습 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]))
딕셔너리이름[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)
만약 기존에 있던 key값을 입력한다면, 수정된다.
my_info = {'이름': '박솔비', '나이': '만 25', '메일': 'sb.112097@gmail.com'}
my_info['메일'] = 'solbe-_-@naver.com'
print(my_info)
#{'이름': '박솔비', '나이': '만 25', '메일': 'solbe-_-@naver.com'}
#하루에 몸무게(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)
del, pop(), clear()를 사용한다.
del 딕셔너리명[key]
mem_info = {'이름':'홍길동','메일':'gildong@gmail.com','학년':3,'취미':['농구','게임']}
print(mem_info)
#{'이름': '홍길동', '메일': 'gildong@gmail.com', '학년': 3, '취미': ['농구', '게임']}
del mem_info['메일']
print(mem_info)
#{'이름': '홍길동', '학년': 3, '취미': ['농구', '게임']}
딕셔너리명.pop(key)
mem_info = {'이름':'홍길동','메일':'gildong@gmail.com','학년':3,'취미':['농구','게임']}
delete = mem_info.pop('이름')
print(delete) #홍길동 #반환가능
print(mem_info)
#{'학년': 3, '취미': ['농구', '게임']}
모든아이템을 삭제한다.
mem_info = {'이름':'홍길동','메일':'gildong@gmail.com','학년':3,'취미':['농구','게임']}
mem_info.clear()
print(mem_info) #{}
#딕셔너리에 저장된 점수 중 최저 및 최고 점수를 삭제하는 프로그램을 만들어보자
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}
키 존재 유무 판단
딕셔너리 뿐만 아니라 어디서든 사용가능
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