여러 개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라고 하고, 이러한 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.
자료구조는 각각의 컨테이너 자료형에 따라서 차이가 있으며, 파이썬의 대표적인 컨테이너 자료형으로는 리스트(List), 튜플(Typle), 딕셔너리(Dic), 셋트(Set)가 있다.
student1 = '홍길동'
student2 = '박찬호'
student3 = '이용규'
student4 = '박승철'
student5 = '김지은'
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(students)
print(type(students))
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(students)
print(type(students))
scores = {'kor' : 95, 'eng' : 80, 'mat' : 100}
print(scores)
print(type(scores))
allSales = {'홍길동', '박찬호', '이용규', '박승철', '김지은'} # 중복된 데이터는 하나로 합쳐져서 출력된다.
print(allSales)
print(type(allSales))
배열과 같이 여러 개의 데이터를 나열한 자료구조.
'[ ]'를 이용해서 선언하고, 데이터 구분은 ','를 이용한다.
# 리스트를 선언한다.
student = ['홍길동', '박찬호', '이용규', '박승철', '김지은'] # 데이터의 나열에 ,로 구분지어진다.
print(f'student : {student}') # 리스트로 감싸여진 데이터가 출력된다.
print(student)
# 문자, 숫자 구분없이 사용 가능하다.
student = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
for i in range(5):
print(f'student[{i}] : {student[i]}')
print()
numbers = [10, '십', 30, 40, 50, 60]
for i in range(6):
print(f'numbers[{i}] : {numbers[i]}')
print(type(numbers))
print(type(numbers[0]))
print(type(numbers[1]))
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(students)
print(len(students)) # len() : 아이탬의 갯수를 출력할 수 있다.
for i in range(len(students)): # range()와 len()함수로 리스트의 갯수만큼 반복한다.
print(f'students[{i}] : {students[i]}')
# len()함수는 아이탬의 갯수만 구할뿐 아니라 문자열의 길이도 구할 수 있다.
str = 'Hello word!!'
print(f'str의 길이 : {len(str)}')
studentCnts = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]
for classNo, cnt in studentCnts:
print(f'{classNo}학급 학생수 : {cnt}')
# 리스트안의 리스트의 데이터인 [1, 19]의 1을 classNo가 가리키고 19를 cnt가 가리켜 출력된다.
minScore = 60
scores = [
['국어', 58], ['영어', 77], ['수학', 89], ['과학', 99], ['국사', 50]]
for subject, score in scores:
if score < minScore:
print(f'과락 과목 : {subject}, 점수 : {score}')
print()
# continue를 이용한 방법
for subject, score in scores:
if score >= minScore: continue
print(f'과락 과목 : {subject}, 점수 : {score}')
# cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']
#
# n = 0
# while n < len(cars):
# print(cars[n])
# n += 1
studentCnts = [[1, 18], [2, 19], [3, 23], [4, 21], [5, 20], [6, 22], [7, 17]]
sum = 0
avg = 0
n = 0
while n < len(studentCnts):
classNo = studentCnts[n][0]
cnt = studentCnts[n][1]
print(f'{classNo}학급 학생수 : {cnt}')
sum += cnt
n += 1
print(f'전체 학생 수 : {sum}')
print(f'평균 학생 수 : {sum / len(studentCnts)}')
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
print()
n = 0
while n < len(scores):
if scores[n][1] >= minScore:
n += 1
continue
print(f'과락 과목 : {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; maxClassNo = 0
minCnt = 0; maxCnt = 0
n = 0
while n < len(studentCnts):
if minCnt == 0 or minCnt > studentCnts[n][1]:
minClassNo = studentCnts[n][0]
minCnt = studentCnts[n][1]
if maxCnt < studentCnts[n][1]:
maxClassNo = studentCnts[n][0]
maxCnt = studentCnts[n][1]
n += 1
print(f'학생 수가 가장 적은 학급(학생수) : {minClassNo}학급({minCnt})명')
print(f'학생 수가 가장 많은 학급(학생수) : {maxClassNo}학급({maxCnt})명')
sports = ['농구', '수구', '축구', '마라톤', '테니스']
favoriteSport = input('가장 좋아하는 스포츠 입력 : ')
bestSportIdx = 0
for idx, value in enumerate(sports):
if value == favoriteSport:
bestSportIdx = idx + 1
print(f'{value}(은)는 {bestSportIdx}번째에 있습니다.')
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(f'students : {students}')
print(f'students의 길이 : {len(students)}')
print(f'students의 마지막 인덱스 : {len(students) - 1}')
print('-' * 30)
students.append('강호동')
print(f'students : {students}')
print(f'students의 길이 : {len(students)}')
print(f'students의 마지막 인덱스 : {len(students) - 1}')
myFamilyAge = [['아빠', 40], ['엄마', 38], ['나', 9]]
myFamilyAge.append(['동생', 1])
for idx, value in myFamilyAge:
print(f'{idx}의 나이 : {value}')
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(f'students : {students}')
print(f'students의 길이 : {len(students)}')
print(f'students의 마지막 인덱스 : {len(students) - 1}')
print('-' * 30)
students.insert(3, '강호동')
print(f'students : {students}')
print(f'students의 길이 : {len(students)}')
print(f'students의 마지막 인덱스 : {len(students) - 1}')
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
print(f'students : {students}')
print(f'students의 길이 : {len(students)}')
print(f'students의 마지막 인덱스 : {len(students) - 1}')
print('-' * 30)
students.pop()
print(f'students : {students}')
print(f'students의 길이 : {len(students)}')
print(f'students의 마지막 인덱스 : {len(students) - 1}')
print('-' * 30)
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
str = students.pop(3)
print(f'students : {students}')
print(f'students의 길이 : {len(students)}')
print(f'students의 마지막 인덱스 : {len(students) - 1}')
print('-' * 30)
print(f'str : {str}') # 삭제한 데이터를 변수에 집어넣어 출력할 수도 있다.
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(students)
students.remove('박찬호')
print(students)
group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']
print(f'group1 : {group1}')
print(f'group2 : {group2}')
# group1.extend(group2)
# print(f'group1 : {group1}')
# print(f'group2 : {group2}')
result = group1 + group2
print(f'result : {result}')
print(f'group1 : {group1}')
print(f'group2 : {group2}')
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(f'students : {students}')
students.sort(reverse=True) # 오름차순
print(f'students : {students}')
students.sort(reverse=False) # 내림차순
print(f'students : {students}')
숫자형으로도 정렬이 가능하다.
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(students)
students.reverse()
print(students) # 순서를 반대로 뒤집었다.
numvers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print(numvers)
numvers.reverse()
print(numvers)
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(f'students : {students}')
print(f'students : {students[2:4]}')
print(f'students : {students[:4]}')
print(f'students : {students[2:]}')
print(f'students : {students[2:-2]}')
print(f'students : {students[-5:-2]}')
numvers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print(f'numvers : {numvers}')
print(f'numvers : {numvers[2:4]}')
print(f'numvers : {numvers[:4]}')
print(f'numvers : {numvers[2:]}')
print(f'numvers : {numvers[2:-2]}')
print(f'numvers : {numvers[-5:-2]}')
students = ['홍길동', '박찬호', '이용규']
print(f'students : {students}')
studentsMul = students * 3
print(f'studentsMul : {studentsMul}')
numvers = [2, 50, 0.12, 1, 9]
print(f'numvers : {numvers}')
numversMul = numvers * 2
print(f'numversMul : {numversMul}')
students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print(f'students : {students}')
studentsIdx = students.index('강호동')
print(f'studentsIdx : {studentsIdx}')
studentsIdx = students.index('강호동', 2, 6) # 인덱스 2부터 인덱스 6앞까지의 범위중에서 강호동을 찾는 방법
print(f'studentsIdx : {studentsIdx}')
numvers = [2, 50, 0.12, 1, 9]
numversIdx = numvers.index(0.12)
print(f'numversIdx : {numversIdx}')
students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print(f'students : {students}')
studentsCnt = students.count('홍길동')
print(f'studentsCnt : {studentsCnt}')
studentsCnt = students.count('강호동')
print(f'studentsCnt : {studentsCnt}')
studentsCnt = students.count('김아무개')
print(f'studentsCnt : {studentsCnt}')
students = ('홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은')
print(f'students : {students}')
print(f'students type : {type(students)}')
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(f'students[0] : {students[0]}')
print(f'students[1] : {students[1]}')
print(f'students[2] : {students[2]}')
print(f'students[3] : {students[3]}')
print(f'students[4] : {students[4]}')
# 문자열과 마찬가지로 숫자형도 가능하다.
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
searchName = input('학생 이름 입력 : ')
if searchName in students: # in 존재하면 True 아니면 Fales
print(f'{searchName} 학생은 우리반 학생입니다.')
else:
print(f'{searchName} 학생은 우리반 학생이 아닙니다.')
if searchName not in students:
print(f'{searchName} 학생은 우리반 학생입니다.')
else:
print(f'{searchName} 학생은 우리반 학생이 아닙니다.')
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동')
sLength = len(students)
print(f'sLength : {sLength}')
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동')
for i in range(len(students)):
print(f'i : {i}')
print(f'students[{i}] : {students[i]}')
print()
n = 0
sLength = len(students)
while n < sLength:
print(f'n : {n}')
print(f'students[{n}] : {students[n]}')
n += 1
students1 = ('홍길동', '박찬호', '이용규')
students2 = ('박승철', '김지은', '강호동')
studentsTuple3 = students1 + students2
print(f'studentsTuple3 : {studentsTuple3}')
students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
print(f'students : {students}')
print(f'students[2:4] : {students[2:4]}')
print(f'students[:4] : {students[:4]}')
print(f'students[2:] : {students[2:]}')
print(f'students[2:-2] : {students[2:-2]}')
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(f'students : {students}')
students[1:4] = ('park chanho', 'lee youggyu', 'gang hodong')
print(f'students : {students}')
print(f'students type : {type(students)}')
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(f'students : {students}')
print(f'students type : {type(students)}')
students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
print(f'students : {students}')
print(f'students type : {type(students)}')
students = '홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은'
print(f'students : {students}')
print(f'students type : {type(students)}')
students = '홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은'
students = list(students)
print(f'students : {students}')
print(f'students type : {type(students)}')
students = tuple(students)
print(f'students : {students}')
print(f'students type : {type(students)}')
튜플은 수정이 불가하기 때문에 리스트로 변환 후 정렬하자.
기본적으로 정렬을 할땐 리스트로 변환 후 sort() 함수를 이용하여 정렬할 수 있다.
ex : list() -> sort(reverse=True) -> tuple() ---> 내림차순 정렬
sorted() 함수를 이용하면 튜플도 정렬할 수 있다.
sorted() ---> 오름차순 정렬 하지만 정렬 후에는 list형으로 변환된다.
ex : sort(reverse=True) --> 내림차순 정렬, sort(reverse=False) --> 올림차순 정렬(기본적으로 False가 입력된다.)
students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
print(f'students : {students}')
print(f'students type : {type(students)}')
students = list(students)
students.sort(reverse=True)
print(f'students : {students}')
print(f'students type : {type(students)}')
students = tuple(students)
print(f'students : {students}')
print(f'students type : {type(students)}')
students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
sortedstudents = sorted(students) # 튜플의 정렬 함수인 sorted() 함수를 이용할땐 자료형을 변환할 때 처럼 감싸서 사용해야한다.
print(f'sortedstudents : {sortedstudents}')
print(f'sortedstudents type : {type(sortedstudents)}')
# 튜플에서 정렬이 끝난 후 리스트 타입으로 변환 된것을 확인할 수 있다.
cars = '그랜저', '소나타', '말리부', '카니발', '쏘렌토' # ()를 사용하지않아도 튜플형으로 선언할 수 있다.
for i in range(len(cars)):
print(cars[i])
print()
for car in cars:
print(car)
studentCnts = ((1, 19),(2, 20),(3, 22),(4, 18),(5, 21))
for i in range(len(studentCnts)):
print(f'{studentCnts[i][0]}학급 학생수 : {studentCnts[i][1]}')
print()
for classNo, cnt in studentCnts:
print(f'{classNo}학급 학생수 : {cnt}')
minScore = 60
scores = (('국어', 58), ('영어', 77), ('수학', 89), ('과학', 99), ('국사', 50))
for item in scores:
if item[1] < minScore:
print(f'과락 과목 : {item[0]}, 점수 : {item[1]}')
print()
for subject, score in scores:
if score < minScore:
print(f'과락 과목 : {subject}, 점수 : {score}')
print()
# continue 이용
for subject, score in scores:
if score >= minScore: continue
print(f'과락 과목 : {subject}, 점수 : {score}')
cars = '그랜저', '소나타', '말리부', '카니발', '쏘렌토'
n = 0
while n < len(cars):
print(cars[n])
n += 1
print()
n = 0
flag = True
while flag:
print(cars[n])
n += 1
if n == len(cars):
flag = False
print()
n = 0
while True:
print(cars[n])
n += 1
if n == len(cars):
break
studentCnts = ((1, 19),(2, 20),(3, 22),(4, 18),(5, 21))
n = 0
while n < len(studentCnts):
print(f'{studentCnts[n][0]}학급 학생수 : {studentCnts[n][1]}')
n += 1
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
while n < len(scores):
if scores[n][1] > minScore:
n += 1
continue
print(f'과락 과목 : {scores[n][0]}, 점수 : {scores[n][1]}')
n += 1
students = {'s1' : '홍길동', 's2' : '박찬호', 's3' : '이용규', 's4' : '박승철', 's5' : '김지은'}
memInfo = {'이름' : '홍길동', '메일' : 'gildong@gmail.com', '학년' : 3, '취미' : ['농구', '게임']}
students1 = {'이름' : '홍길동', '메일' : 'gildong@gmail.com', '학년' : 3}
students2 = {'이름' : '박찬호', '메일' : 'chanho@gmail.com', '학년' : 2}
students3 = {'이름' : '이용규', '메일' : 'yonggyu@gmail.com', '학년' : 1}
studentsInfo = {1 : students1, 2 : students2 , 3 : students3}
print(studentsInfo)
students = {'s1' : '홍길동', 's2' : '박찬호', 's3' : '이용규', 's4' : ['박승철', '이용규'], 's5' : '김지은'}
print(f'students[\'s1\']의 값은 : {students["s1"]}')
print(f'students[\'s2\']의 값은 : {students["s2"]}')
print(f'students[\'s3\']의 값은 : {students["s3"]}')
print(f'students[\'s4\']의 값은 : {students["s4"]}')
print(f'students[\'s4\']의 값은 : {students["s4"][0]}')
print(f'students[\'s4\']의 값은 : {students["s4"][1]}')
# 값안에 리스트도 입력이 가능하다.
# 존재하지않을시 키(key)에러가 발생한다.
# get()함수를 이용한 조회
# get(ket)를 이용해서 값(value)을 조회 할 수 있다. (get()은 key가 없어도 에러가 발생하지 않는다.)
print(students.get('s7'))
myInfo = {}
myInfo['이름'] = '박경진'
myInfo['전공'] = 'computer'
myInfo['메일'] = 'jin@gmail.com'
myInfo['학년'] = 3
myInfo['주소'] = 'korea seoul'
myInfo['취미'] = ['수영', '여행']
print(myInfo)
myInfo['메일'] = 'jin@naver.com'
# 같은 키에 다른 값을 넣으면 가장 최근에 넣은 값으로 변경된다.
print(myInfo)
# 변경된 값을 확인 할 수 있다.
myInfo = {}
myInfo['이름'] = '박경진'
myInfo['전공'] = 'computer'
myInfo['메일'] = 'jin@gmail.com'
myInfo['학년'] = 3
myInfo['주소'] = 'korea seoul'
myInfo['취미'] = ['수영', '여행']
print(myInfo)
myInfo['전공'] = 'sports'
myInfo['학년'] = 4
print(myInfo)
memInfo = {'이름' : '홍길동', '메일' : 'gildong@gmail.com', '학년' : 3, '취미' : ['농구', '게임']}
ks = memInfo.keys()
print(f'ks : {ks}')
print(f'ks type : {type(ks)}')
vs = memInfo.values()
print(f'vs : {vs}')
print(f'vs type : {type(vs)}')
items = memInfo.items()
print(f'items : {items}')
print(f'items type : {type(items)}')
# items()는 튜플로 반환한다.
memInfo = {'이름' : '홍길동', '메일' : 'gildong@gmail.com', '학년' : 3, '취미' : ['농구', '게임']}
print(f'memInfo : {memInfo}')
del memInfo['메일']
print(f'memInfo : {memInfo}')
memInfo = {'이름' : '홍길동', '메일' : 'gildong@gmail.com', '학년' : 3, '취미' : ['농구', '게임']}
print(f'memInfo : {memInfo}')
memInfoValue = memInfo.pop('메일')
print(f'memInfo : {memInfo}')
print(f'memInfoValue : {memInfoValue}')
print(f'memInfoValue type : {type(memInfoValue)}')
memInfoValue = memInfo.pop('취미')
print(f'memInfo : {memInfo}')
print(f'memInfoValue : {memInfoValue}')
print(f'memInfoValue type : {type(memInfoValue)}')
memInfo = {'이름' : '홍길동', '메일' : 'gildong@gmail.com', '학년' : 3, '취미' : ['농구', '게임']}
print('이름' in memInfo)
print('메일' in memInfo)
print('학년' in memInfo)
print('취미' in memInfo)
print()
print('name' not in memInfo)
print('mail' not in memInfo)
print('grade' not in memInfo)
print('hoppy' not in memInfo)
memInfo = {'이름' : '홍길동', '메일' : 'gildong@gmail.com', '학년' : 3, '취미' : ['농구', '게임']}
print(f'len(memInfo) : {len(memInfo)}')
memInfo = {'이름' : '홍길동', '메일' : 'gildong@gmail.com', '학년' : 3, '취미' : ['농구', '게임']}
print(f'memInfo : {memInfo}')
print(f'len(memInfo) : {len(memInfo)}')
memInfo.clear() # 딕셔너리안에있는 모든 아이템을 지운다.
print(f'memInfo : {memInfo}')
print(f'len(memInfo) : {len(memInfo)}')