제로베이스 데이터 스쿨 6기에 참여한 뒤로 할게 많아서 그런지 시간도 엄청 빠르게 가는 느낌?
# 자료구조란? 여러 개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라고 하고,
# 이러한 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.
# 자료구조는 각각의 컨테이너 자료형에 따라서 차이가 있으며, 파이썬의 대표적인 컨테이너 자료형으로는
# 리스트, 튜퓰, 딕셔너리, 셋트가 있다.
list = ['홍길동', '손흥민', '김연아'] # 언제든지 수정 가능
tuple = ('의사', '변호사', '교수') # 한번 데이터가 정해지면 수정 불가
dictionary = {'kor':88, 'eng':91, 'mat':90, 'his':77} # 키 값이 있음
set = {100, 150, 90, 110} # 리스트, 튜플과 비슷하나, 중복된 데이터가 허용되지 않는다!
for i in list:
print(i)
# 리스트는 '[]'를 이용해서 선언하고, 데이터 구분은 ','를 이용한다.
# 숫자, 문자(열), 논리형 등 모든 기본 데이터를 같이 저장할 수 있다.
strs = [3.14, '십', 20, 'one', '3.141592']
# 리스트에 또 다른 컨테이너 자료형 데이터를 저장할 수도 있다.
datas = [10, 20, 30, [40, 50, 60]]
# 인덱스란, 아이템에 자동으로 부여되는 번호표
# ['손흥민', '김민재', '박지성', '안정환', '기성용']
# 0 1 2 3 4 <-- 인덱스
print('students[0]: {}'.format(students[0]))
print('students[1]: {}'.format(students[1]))
print('students[2]: {}'.format(students[2]))
print('students[3]: {}'.format(students[3]))
print('students[4]: {}'.format(students[4]))
# 리스트 길이란, 리스트에 저장된 아이템 개수를 뜻한다.
students = ['손흥민', '김민재', '박지성', '안정환', '기성용']
sLength = len(students)
print('length of student: {}'.format(sLength))
# len()과 반복문을 이용하면 리스트의 아이템 조회가 가능하다.
for i in range(len(students)):
print('i: {}'.format(i))
print('students[i]: {}'.format(students[i]))
# len() 함수는 리스트의 개수뿐만 아니라 문자열의 길이도 알 수 있다.
str = 'Hello python!!'
print('\'Hello python\'의 길이: {}'.format(len(str)))
cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']
for i in range(len(cars)):
print(cars[i])
# for문을 이용하면 리스트의 아이템을 자동으로 참조할 수 있다.
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문과 if문을 이용해서 과락 과목 출력하기
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
print('과락 과목: {}, 점수: {}'.format(subject, score))
# 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
# while문과 if문을 이용해서 과락 과목 출력하기
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
# enumerate()함수를 활용하면 아이템을 열거할 수 있다.
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))
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print('students: {}'.format(students))
print('students의 길이: {}'.format(len(students)))
print('students의 마지막 인덱스: {}'.format(len(students) - 1))
# append() 함수를 이용하면 마지막 인덱스에 아이템을 추가할 수 있다.
students.append('강호동')
print('students: {}'.format(students))
print('students의 길이: {}'.format(len(students)))
print('students의 마지막 인덱스: {}'.format(len(students) - 1))
scores = [['국어', 88], ['영어', 91]]
scores.append(['수학', 96])
print('scores: {}'.format(scores))
for subject, score in scores:
print('과목: {}\t 점수: {}'.format(subject, score))
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print('students: {}'.format(students))
print('students의 길이: {}'.format(len(students)))
print('students의 마지막 인덱스: {}'.format(len(students) - 1))
# 특정 인덱스 위치에 아이템 추가하기
# insert() 함수를 이용하면 특정 위치(인덱스)에 아이템을 추가할 수 있다.
students.insert(3, '강호동')
print('students: {}'.format(students))
print('students의 길이: {}'.format(len(students)))
print('students의 마지막 인덱스: {}'.format(len(students) - 1))
words = ['I', 'a', 'boy.']
words.insert(1, 'am')
for word in words:
print(word, end=' ')
# pop() 함수를 이용하면 마지막 인덱스에 해당하는 아이템을 삭제할 수 있다.
# pop(n) 함수를 n인덱스에 해당하는 아이템을 삭제할 수 있다.
# insert()의 반대개념이라고 생각하면 된다!
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
print('students: {}'.format(students))
print('students length: {}'.format(len(students)))
students.pop()
print('students: {}'.format(students))
print('students length: {}'.format(len(students)))
rValue = students.pop(0)
print('rValue: {}'.format(rValue))
print('students: {}'.format(students))
print('students length: {}'.format(len(students)))
# remove() 함수를 이용하면 특정 아이템을 삭제할 수 있다.
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
print(students)
students.remove('박찬호')
print(students)
# remove()는 하나의 데이터만 삭제할 수 있다.
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은', '강호동']
students.remove('강호동')
print(students)
# 모든 '강호동'을 지우기 위해서는 while문을 이용
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은', '강호동']
while '강호동' in students:
students.remove('강호동')
print(students)
# 리스트 연결(확장)
# extend()함수를 이용하면 리스트에 또 다른 리스트를 연결(확장)할 수 있다.
group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']
print('group1: {}'.format(group1))
print('group2: {}'.format(group2))
# group1.extend(group2)
# print('group1: {}'.format(group1))
# print('group2: {}'.format(group2))
# 덧셈 연산을 이용해서 연결하기!
result = group1 + group2
print('result: {}'.format(result))
print('group1: {}'.format(group1))
print('group2: {}'.format(group2))
# sort() 함수를 이용하면 아이템을 정렬할 수 있다. 오름차순 정렬
names = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(names)
names.sort()
print(names)
names.sort(reverse=True) # reverse=True 옵션으로 내림차순으로 정렬 가능!!
print(names)
# 문자열뿐 아니라 숫자들도 정렬 가능!!
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print(numbers)
numbers.sort()
print(numbers)
numbers.sort(reverse=True)
print(numbers)
# reverse() 함수를 이용하면 아이템 순서를 뒤집을 수 있다.
names = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(names)
names.reverse()
print(names)
# 역시 문자열뿐 아니라 숫자에 적용 가능!!
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print(numbers)
numbers.reverse()
print(numbers)
# 리스트 슬라이싱: 원하는 아이템만 뽑아내자
# [n:m]을 이용하면 리스트에서 원하는 아이템만 뽑아낼 수 있다.
# 홍길동, 박찬호, 이용규, 강호동, 박승철, 김지은
# [2:4] --> 2 <= n < 4 --> 이용규, 강호동
names = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('names: {}'.format(names))
print('names[2:4]: {}'.format(names[2:4]))
print('names[:4]: {}'.format(names[:4]))
print('names[2:]: {}'.format(names[2:]))
print('names[2:-2]: {}'.format(names[2:-2])) # 음수를 사용하면 뒤쪽에서부터 계산한다!
print('names[-5:-2]: {}'.format(names[-5:-2])) # 음수를 사용하면 뒤쪽에서부터 계산한다!
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))
print('numbers[2:4]: {}'.format(numbers[2:4]))
print('numbers[:4]: {}'.format(numbers[:4]))
print('numbers[2:]: {}'.format(numbers[2:]))
print('numbers[2:-2]: {}'.format(numbers[2:-2]))
print('numbers[-5:-2]: {}'.format(numbers[-5:-2]))
# 슬라이싱을 이용한 아이템 변경
names[1:4] = ['park', 'lee', 'kang']
print(names)
# slice()함수를 이용해서 아이템을 슬라이싱할 수 있다.
print(names[slice(2, 4)])
# 리스트를 곱셈 연산하면 아이템이 반복된다.
students = ['홍길동', '박찬호', '이용규']
print(students)
studentsMul = students * 2
print(studentsMul)
numbers = [2, 50, 0.12, 1, 9]
print(numbers)
numbersMul = numbers * 3
print(numbersMul)
# index(item)함수로 item의 인덱스를 알아낼 수 있다.
print(students.index('홍길동'))
print(students.index('박찬호'))
print(students.index('이용규'))
# index(item, n, m)으로 범위 설정 가능
print(studentsMul.index('홍길동'))
print(studentsMul.index('홍길동', 3, 6))
# count() 함수를 이용하면 특정 아이템의 개수를 알아낼 수 있다.
students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print('students: {}'.format(students))
searchCnt = students.count('강호동')
print('searchCnt: {}'.format(searchCnt))
# del 키워드를 이용하면 특정 index의 아이템을 삭제할 수 있다.
del students[0]
print('students: {}'.format(students))
del students[2:]
print('students: {}'.format(students))
# 튜플: 리스트와 비슷하지만 아이템 변경 불가!!!
# '()'를 이용해서 선언하고, 데이터 구분은 ','를 이용한다.
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print('students: {}'.format(students))
print('students type: {}'.format(type(students)))
numbers = (10, 20, 30, 40, 50, 60, 70)
print('numbers: {}'.format(numbers))
print('students type: {}'.format(type(numbers)))
strs = (3.14, '십', 20, 'one', '3.141592')
datas = (10, 20, 30, (40, 50, 60))
# 튜플의 아이템을 조회하자
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print('students[0]: {}'.format(students[0]))
print('students[1]: {}'.format(students[1]))
print('students[2]: {}'.format(students[2]))
print('students[3]: {}'.format(students[3]))
print('students[4]: {}'.format(students[4]))
numbers = (10, 20, 30, 40, 50)
print('numbers[0]: {}'.format(numbers[0]))
print('numbers[1]: {}'.format(numbers[1]))
print('numbers[2]: {}'.format(numbers[2]))
print('numbers[3]: {}'.format(numbers[3]))
print('numbers[4]: {}'.format(numbers[4]))
# 아이템 존재 유/무 판단하기!
# in, not in 키워드를 이용하면 아이템의 존재 유/무를 알 수 있다.
studentsTuple = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
searchName = input('학생 이름 입력: ')
if searchName in studentsTuple:
print('{} 학생은 우리반 학생입니다.'.format(searchName))
else:
print('{} 학생은 우리반 학생이 아닙니다.'.format(searchName))
# in, not in 키워드는 문자열에서도 사용 가능하다.
# 리스트와 마찬가지로, 튜플에 저장된 아이템 개수를 튜플 길이라고 한다.
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
sLength = len(students)
print(sLength)
# len()과 반복문을 이용하면 튜플의 아이템 조회가 가능하다.
for i in range(sLength):
print('i: {}'.format(i))
print('students[{}]: {}'.format(i, students[i]))
n = 0
while n < sLength:
print('n: {}'.format(n))
print('students[{}]: {}'.format(n, students[n]))
n += 1
for student in students:
print('students: {}'.format(student))
# 두 개의 튜플을 합쳐서 새로운 튜플을 만들자!
studentTuple1 = ('홍길동', '박찬호', '이용규')
print('studentTuple1: {}'.format(studentTuple1))
studentTuple2 = ('박승철', '김지은', '강호동')
print('studentTuple2: {}'.format(studentTuple2))
studentTuple3 = studentTuple1 + studentTuple2
print('studentTuple3: {}'.format(studentTuple3))
# 리스트에서 사용할 수 있는 extend()함수를 튜플에서는 사용할 수 없다.
studentTuple1.extend(studentTuple2) # 튜플에서 사용 불가라서 에러가 나온다.
# 튜플 슬라이싱: 원하는 아이템만 뽑아내자
# 리스트와 마찬가지로 [n:m]을 이용하면 리스트에서 원하는 아이템만 뽑아낼 수 있다.
students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
print('students: {}'.format(students))
print('students[2:5]: {}'.format(students[2:5]))
print('students[:4]: {}'.format(students[:4]))
print('students[3:]: {}'.format(students[3:]))
print('students[2:-2]: {}'.format(students[2:-2]))
print('students[-5:-2]: {}'.format(students[-5:-2]))
numbers = [2, 50, 0.12, 1, 9, 7, 17]
print('numbers: {}'.format(numbers))
print('numbers[2:5]: {}'.format(numbers[2:5]))
print('numbers[-4:-2]: {}'.format(numbers[-4:-2]))
print('numbers[0:len(numbers):2]: {}'.format(numbers[0:len(numbers):2]))
# 튜플은 슬라이싱을 이용해서 아이템을 변경할 수 없다.
# 리스트에 튜플 아이템으로 변경 가능
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students[1:4] = ('park', 'lee', 'gang')
print('students: {}'.format(students))
print('type of students: {}'.format(type(students)))
# 튜플은 리스트와 달리 아이템 추가, 변경, 삭제가 불가하다.
# students.append() students[3] = '유재석' students.pop() 등 사용 불가!!!
# 튜플은 선언 시 괄호 생략이 가능하다.
students = ('홍길동', '박찬호', '이용규', '강호동')
print(students)
students2 = '홍길동', '박찬호', '이용규', '강호동'
print(students2)
# 리스트와 튜플은 자료형 변환이 가능하다.
studentList = list(students)
print(studentList)
print(type(studentList))
# 튜플은 수정이 불가하기 때문에 리스트로 변환 후 정렬하자.
# list() --> sort() --> tuple()
# sorted() 함수를 이용하면 튜플도 정렬할 수 있다.
# sorted()는 리스트 자료형을 반환한다.
students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
print(students)
print(type(students))
students = sorted(students)
print(students)
print(type(students))
numbers = (2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14)
print(numbers)
numbers = sorted(numbers)
print(numbers)
# 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 i in range(len(studentCnts)):
print('{}학급 학생수: {}'.format(studentCnts[i][0], studentCnts[i][1]))
# 똑같지만 더 간단한 방법!!
for classNo, cnt in studentCnts:
print('{}학급 학생수: {}'.format(classNo, cnt))
# for문과 if문을 이용해서 과락 과목 출력하기
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
print('과락 과목: {}, 점수: {}'.format(subject, score))
# 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
studentCnts = (1, 19), (2, 20), (3, 22), (4, 18), (5, 21)
n = 0
while n <= len(studentCnts):
print('{}학급 학생수: {}'.format(studentCnts[n][0], studentCnts[n][1]))
n += 1
# while문과 if문을 이용해서 과락 과목 출력하기
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
# 딕셔너리: 키(key)와 값(value)를 이용해서 자룔르 관리한다.
# 인덱스가 존재하지 않고 key가 index대신 존재한다.
# 딕셔너리 선언
students = {'s1': '홍길동', 's2': '박찬호', 's3': '이용규', 's4': '박승철', 's5': '김지은'}
print(students)
# key와 value에는 숫자, 문자(열), 논리형 뿐만 아니라 컨테이너 자료형도 올 수 있다.
# 단, key에 immutable 값은 올 수 있지만 mutable값은 올 수 없다.
# 딕셔너리는 key를 이용해서 value를 조회한다.
students = {'s1': '홍길동', 's2': '박찬호', 's3': '이용규', 's4': '박승철', 's5': '김지은'}
print('students[\'s1\']: {}'.format(students['s1']))
print('students[\'s2\']: {}'.format(students['s2']))
print('students[\'s3\']: {}'.format(students['s3']))
print('students[\'s4\']: {}'.format(students['s4']))
print('students[\'s5\']: {}'.format(students['s5']))
# print(students['s6']) --> 없는 키값을 조회하여 Error 발생!!!
# get()함수를 이용한 딕셔너리 조회
print(students.get('s1'))
print(students.get('s2'))
print(students.get('s3'))
print(students.get('s4'))
print(students.get('s5'))
print(students.get('s6')) # --> get()함수는 없는 키값 조회하여도 None이 조회된다!!
# key를 이용해서 아이템을 추가하자
# 딕셔너리이름[키(key)] = 값(value) 형태로 아이템을 추가한다.
myInfo = {}
myInfo['이름'] = '김태호'
myInfo['전공'] = 'statistics'
myInfo['메일'] = 'abc@gmail.com'
myInfo['학년'] = 4
myInfo['주소'] = '성남시 분당구'
myInfo['취미'] = ['테니스', '축구', '리그오브레전드']
print('myInfo: {}'.format(myInfo))
# 추가 하려는 키가 이미 있다면 기존 값이 변경된다!!
myInfo['메일'] = 'abcdefg@gmail.com'
print('myInfo: {}'.format(myInfo))
# 딕셔너리이름[키(key)] = 값(value) 형태로 아이템을 수정한다.
# 학생의 시험 점수가 60점 미만이면 'F(재시험)'으로 값을 변경해보자.
scores = {'kor': 88, 'eng': 55, 'mat': 85, 'sci': 57, 'his': 82}
print('scores: {}'.format(scores))
minScore = 60
fStr = 'F(재시험)'
if scores['kor'] < minScore: scores['kor'] = fStr
if scores['eng'] < minScore: scores['eng'] = fStr
if scores['mat'] < minScore: scores['mat'] = fStr
if scores['sci'] < minScore: scores['sci'] = fStr
if scores['his'] < minScore: scores['his'] = fStr
print('scores: {}'.format(scores))
# keys()와 values() 와 items()
memInfo = {'이름': '김태호', '메일': 'abc@gmail.com', '학년': 3, '취미': ['테니스', '게임']}
ks = memInfo.keys()
print(ks)
vs = memInfo.values()
print(vs)
items = memInfo.items()
print(items)
# 리스트로 변환
ks = list(ks)
vs = list(vs)
items = list(items)
print(ks)
print(vs)
print(items)
# for문을 이용한 조회
for key in ks:
print('key: {}'.format(key))
for idx, key in enumerate(ks):
print('idx, key: {}, {}'.format(idx, key))
# 딕셔너리에서 가장 많이 쓰이는 조회 방법!!!
for key in memInfo.keys():
print('{}: {}'.format(key, memInfo[key]))
# # del과 key를 이용한 item 삭제
# memInfo = {'이름': '김태호', '메일': 'abc@gmail.com', '학년': 3, '취미': ['테니스', '게임']}
# print(f'memInfo: {memInfo}')
#
# # '메일' 삭제!
# del memInfo['메일']
# print(f'memInfo: {memInfo}')
#
# # '취미' 삭제!
# del memInfo['취미']
# print(f'memInfo: {memInfo}')
# pop()과 key를 이용한 item 삭제
memInfo = {'이름': '김태호', '메일': 'abc@gmail.com', '학년': 3, '취미': ['테니스', '게임']}
print(f'memInfo: {memInfo}')
returnValue = memInfo.pop('이름')
print(f'memInfo: {memInfo}')
print(f'returnValue: {returnValue}')
# 키(key) 존재 유/무 판단: in, not in
memInfo = {'이름': '김태호', '메일': 'abc@gmail.com', '학년': 3, '취미': ['테니스', '게임']}
print('이름' in memInfo)
print('메일' in memInfo)
print('학년' in memInfo)
print('취미' in memInfo)
print('name' not in memInfo)
print('mail' not in memInfo)
print('grade' not in memInfo)
print('hobby' not in memInfo)
# len(): 딕셔너리 길이(아이템 개수)를 알 수 있다.
print('len(memInfo): {}'.format(len(memInfo)))
# clear(): 모든 아이템을 삭제한다.
print(memInfo)
memInfo.clear()
print(memInfo)