여러개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라하고, 이러한 컨테이너 자료형의 데이터구조를 자료구조라고 함
#단일 데이터
student1 = '홍길동'
student2 = '박찬호'
student3 = '이용규'
student4 = '박승철'
student5 = '김지은'
###컨테이너 자료형
#리스트
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(students)
print(type(students))
#튜플
students1 = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(students1)
print(type(students1))
#딕셔너리
scores = {'kor':95, 'eng': 89, 'mat': 90}
print(scores)
print(type(scores))
#세트
allSales = {100, 200, 400, 90, 400}
print(allSales)
print(type(allSales))
⇊
['홍길동', '박찬호', '이용규', '박승철', '김지은']
<class 'list'>
('홍길동', '박찬호', '이용규', '박승철', '김지은')
<class 'tuple'>
{'kor': 95, 'eng': 89, 'mat': 90}
<class 'dict'>
{200, 90, 100, 400}
<class 'set'>
배열과 같이 여러 개의 데이터를 나열한 자료구조
숫자,문자(열),논리형 등 모든 기본 데이터를 같이 저장 가능
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
numbers = [10, 20, 30, 40, 50]
str = [3.14, '십', 20, 'one', '3.141592']
리스트에 또 다른 컨테이너 자료형 데이터 저장가능
data = [10, 20, 30, [40, 50, 60]]
인덱스 : 아이템에 자동으로 0부터 부여되는 번호표
리스트 아이템은 인덱스를 이용해서 조회 가능
#5명의 학생이름을 리스트에 저장하고 인덱스가 홀수인 학생과 짝수(0포함)인 학생을 구분해서 인덱스와 학생이름 출력
students = ['김성예', '신경도', '박기준', '최승철', '황동석']
print('--인덱스가 짝수인 학생--')
print(f'students[0]: {students[0]}')
print(f'students[2]: {students[2]}')
print(f'students[4]: {students[4]}')
print('--인덱스가 홀수인 학생--')
print(f'students[0]: {students[1]}')
print(f'students[2]: {students[3]}')
##for문으로 변경
for i in range(5):
if i % 2 == 0:
print(f'인덱스 짝수: students[{i}]: {students[i]}')
else:
print(f'인덱스 홀수: students[{i}]: {students[i]}')
⇊
--인덱스가 짝수인 학생--
students[0]: 김성예
students[2]: 박기준
students[4]: 황동석
--인덱스가 홀수인 학생--
students[0]: 신경도
students[2]: 최승철
인덱스 짝수: students[0]: 김성예
인덱스 홀수: students[1]: 신경도
인덱스 짝수: students[2]: 박기준
인덱스 홀수: students[3]: 최승철
인덱스 짝수: students[4]: 황동석
리스트에 저장된 아이템 개수
len()과 반복문을 이용하면 리스트 아이템 조회 가능
###for문
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
for i in range(len(students)):
print(f'i : {i}')
print(f'students[{i}] : {students[i]}')
##while문
n = 0
sLength = len(students)
while n < sLength:
print(f'n: {n}')
print(f'students[{n}]: {students[n]}')
n += 1
⇊
i : 0
students[0] : 홍길동
i : 1
students[1] : 박찬호
i : 2
students[2] : 이용규
i : 3
students[3] : 박승철
i : 4
students[4] : 김지은
n: 0
students[0]: 홍길동
n: 1
students[1]: 박찬호
n: 2
students[2]: 이용규
n: 3
students[3]: 박승철
n: 4
students[4]: 김지은
len()함수는 리스트 개수뿐만 아니라 문자열의 길이도 알 수 있음
str = 'Hello python'
print(len(str))
⇊
12
for문을 이용하면 리스트의 아이템을 자동으로 참조가능
cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']
for i in range(len(cars)):
print(cars[i])
print('-'*40)
for car in cars:
print(car)
⇊
그랜저
소나타
말리부
카니발
쏘렌토
----------------------------------------
그랜저
소나타
말리부
카니발
쏘렌토
for문을 이용하면 리스트 내부의 또다른 리스트 아이템 조회 가능
studentCnt = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]
for classNo, cnt in studentCnt:
print(f'{classNo}학급 학생수: {cnt}')
⇊
1학급 학생수: 19
2학급 학생수: 20
3학급 학생수: 22
4학급 학생수: 18
5학급 학생수: 21
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
##셋 다 결과는 같음
⇊
그랜저
소나타
말리부
카니발
쏘렌토
아이템을 열거할 수 있는 함수
sports = ['농구', '수구', '축구', '마라톤', '테니스']
for idx, value in enumerate(sports): ##idx:인덱스 value:아이템
print(f'{idx} : {value}')
⇊
0 : 농구
1 : 수구
2 : 축구
3 : 마라톤
4 : 테니스
-문자열에도 적용 가능
str = 'Hello python'
for idx, value in enumerate(str):
print(f'{idx} : {value}')
⇊
0 : H
1 : e
2 : l
3 : l
4 : o
5 :
6 : p
7 : y
8 : t
9 : h
10 : o
11 : n
##가장 좋아하는 스포츠가 몇 번째에 있는지 출력
sports = ['농구', '수구', '축구', '마라톤', '테니스']
favoriteSports = input('가장 좋아하는 스포츠 입력: ')
bestSportIdx = 0
for idx, value in enumerate(sports):
if value == favoriteSports:
bestSportIdx = idx + 1
print(f'{favoriteSports}은(는) {bestSportIdx}번째에 있습니다')
⇊
가장 좋아하는 스포츠 입력: 농구
농구은(는) 1번째에 있습니다
마지막 인덱스에 아이템 추가 가능
scores = [['국어',75], ['영어', 98]]
scores.append(['수학', 70])
print('scores: {}'.format(scores))
for subject, score in scores:
print(f'과목: {subject} \t 점수: {score}')
⇊
scores: [['국어', 75], ['영어', 98], ['수학', 70]]
과목: 국어 점수: 75
과목: 영어 점수: 98
과목: 수학 점수: 70
특정 위치(인덱스)에 아이템 추가 가능
기존에 있던 아이템은 삭제 되는게 아닌 뒤로 밀려남
numbers = [1, 3, 6, 11, 45, 54, 62, 74, 85]
inputNumber = int(input('숫자 입력: '))
insertIdx = 0
for idx, number in enumerate(numbers):
print(idx, number)
if insertIdx == 0 and inputNumber < number: ##들어갈 자리 판단
insertIdx = idx
numbers.insert(insertIdx, inputNumber)
print(numbers)
⇊
숫자 입력: 25
0 1
1 3
2 6
3 11
4 45
5 54
6 62
7 74
8 85
[1, 3, 6, 11, 25, 45, 54, 62, 74, 85]
마지막 인덱스에 해당하는 아이템 삭제 가능
#점수표에서 최저,최고점수 삭제후 출력
playerScores = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playerscores: {}'.format(playerScores))
minScore = 0; maxScore = 0
minScoreIdx = 0; maxScoreIdx = 0
for idx, score in enumerate(playerScores):
if idx == 0 or minScore > score:
minScoreIdx = idx
minScore = score
print('minScore: {}, minScoreIdx: {}'.format(minScore, minScoreIdx))
playerScores.pop(minScoreIdx)
for idx, score in enumerate(playerScores):
if maxScore < score:
maxScoreIdx = idx
maxScore = score
print('maxScore: {}, maxScoreIdx : {}'.format(maxScore, maxScoreIdx))
playerScores.pop(maxScoreIdx)
print('playerscores: {}'.format(playerScores))
⇊
playerscores: [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
minScore: 8.8, minScoreIdx: 4
maxScore: 9.8, maxScoreIdx : 3
playerscores: [9.5, 8.9, 9.2, 9.0]
한 개의 아이템만 삭제 가능. 만약 삭제하려는 데이터가 2개 이상이라면 while문 이용
#일정표에서 사용자가 입력한 일정을 삭제
myList = ['마케팅 회의', '회의록 정리', '점심 약속', '월간 업무 보고', '치과 방문', '마트 장보기']
print('일정: {}'.format(myList))
removeItem = input('삭제 대상 입력: ')
myList.remove(removeItem)
print('일정: {}'.format(myList))
⇊
일정: ['마케팅 회의', '회의록 정리', '점심 약속', '월간 업무 보고', '치과 방문', '마트 장보기']
삭제 대상 입력: 점심 약속
일정: ['마케팅 회의', '회의록 정리', '월간 업무 보고', '치과 방문', '마트 장보기']
리스트에 또 다른 리스트를 연결(확장)
덧셈 연산자를 이용해서 리스트 연결 가능
# 나와 친구가 좋아하는 번호를 합치되, 번호가 중복되지않게 출력
myFavNum = [1, 3, 5, 6, 7]
friFavNum = [2, 3, 5, 8, 10]
print(f'myfavNum: {myFavNum}')
print(f'frifavNum: {friFavNum}')
addList = myFavNum + friFavNum
print(f'add List: {addList}')
result = []
for number in addList: ###addList에 있는 숫자 호출
if number not in result: ##number가 result내에 없다면
result.append(number) ##중복되지 않은 숫자만 호출
print(f'reesult: {result}')
⇊
myfavNum: [1, 3, 5, 6, 7]
frifavNum: [2, 3, 5, 8, 10]
add List: [1, 3, 5, 6, 7, 2, 3, 5, 8, 10]
reesult: [1, 3, 5, 6, 7, 2, 8, 10]
sort(reverse=True) : 내림차순 정렬
#점수표에서 최저 및 최소 젖ㅁ수를 삭제한 후 총점과 평균 출력
playerScore = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playreScore: {}'.format(playerScore))
playerScore.sort() ##적은 수 부터 정렬
print('playreScore: {}'.format(playerScore))
playerScore.pop(0)
playerScore.pop(len(playerScore) - 1)
print('playreScore: {}'.format(playerScore))
sum = 0; avg = 0
for score in playerScore:
sum += score
avg = sum / len(playerScore)
print('총점: %.2f' % sum)
print('평점: %.2f' % avg)
⇊
playreScore: [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
playreScore: [8.8, 8.9, 9.0, 9.2, 9.5, 9.8]
playreScore: [8.9, 9.0, 9.2, 9.5]
총점: 36.60
평점: 9.15
아이템 순서 뒤집기
##암호 해독 프로그램
secret = '27156231'
secretList = []
solvedList = ''
for cha in secret:
secretList.append(int(cha))
secretList.reverse()
print(secretList)
val = secretList[0] * secretList[1]
secretList.insert(2, val) #첫번째,두번째를 곱한것을 다음순서에 놓기
print(secretList)
val = secretList[3] * secretList[4]
secretList.insert(5, val)
print(secretList)
val = secretList[6] * secretList[7]
secretList.insert(8, val)
print(secretList)
val = secretList[9] * secretList[10]
secretList.insert(11, val)
print(secretList)
⇊
[1, 3, 2, 6, 5, 1, 7, 2]
[1, 3, 3, 2, 6, 5, 1, 7, 2]
[1, 3, 3, 2, 6, 12, 5, 1, 7, 2]
[1, 3, 3, 2, 6, 12, 5, 1, 5, 7, 2]
[1, 3, 3, 2, 6, 12, 5, 1, 5, 7, 2, 14]
리스트에서 원하는 아이템만 뽑기
문자열 슬라이싱 가능
n<= [n:m] <m
-슬라이싱 할 떄 단계 설정 가능
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers[2:-2])) ##세번쨰 숫자부터 맨 끝에서 세번째 숫자까지
print('numbers: {}'.format(numbers[2:-2:2])) ## 마지막 숫자는 '단계'
print('numbers: {}'.format(numbers[:-2:2])) ##앞 쪽 숫자 생략(맨 처음부터)
print('numbers: {}'.format(numbers[::2])) ##시작,끝 생략가능(리스트내 숫자) 전부 다 사용)
⇊
numbers: [0.12, 1, 9, 7, 17, 35]
numbers: [0.12, 9, 17]
numbers: [2, 0.12, 9, 17]
numbers: [2, 0.12, 9, 17, 100]
-슬라이싱을 이용해서 아이템 변경 가능
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))
students[1:4] = ['park chan-ho', 'lee young-gyu', 'kang ho-dong']
print('students: {}'.format(students))
⇊
students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students: ['홍길동', 'park chan-ho', 'lee young-gyu', 'kang ho-dong', '박승철', '김지은']
-slice() 함수
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students[slice(2, 4)]))
print('students: {}'.format(students[slice(4)]))
print('students: {}'.format(students[slice(2, len(students))]))
print('students: {}'.format(students[slice(2, len(students)-2)]))
print('students: {}'.format(students[slice(len(students)-5, len(students)-2)]))
⇊
students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students: ['이용규', '강호동']
students: ['홍길동', '박찬호', '이용규', '강호동']
students: ['이용규', '강호동', '박승철', '김지은']
students: ['이용규', '강호동']
students: ['박찬호', '이용규', '강호동']
리스트를 곱셈 연산하면 아이템 반복
students = ['홍길동', '박찬호', '이용규']
print(f'students: {students}')
studentsMul = students * 2
print(f'students: {studentsMul}')
⇊
students: ['홍길동', '박찬호', '이용규']
students: ['홍길동', '박찬호', '이용규', '홍길동', '박찬호', '이용규']
index(item) 함수로 item의 인덱스를 알 수 있음
students = ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print(f'students: {students}')
searchIdx = students.index('강호동', 2, 6) #2번째에서 6번째 사이에서 '강호동' 찾기
print(f'students: {searchIdx}')
⇊
students: ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은']
students: 4
특정 아이템의 개수를 알아낼 수 있음
students = ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은', '박승철']
print('students: {}'.format(students))
searchCnt = students.count('박승철')
print('students: {}'.format(searchCnt))
searchCnt = students.count('홍길동')
print('students: {}'.format(searchCnt))
searchCnt = students.count('김누구')
print('students: {}'.format(searchCnt))
⇊
students: ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은', '박승철']
students: 2
students: 1
students: 0