[데이터스쿨] 자료구조 학습노트

이주희·2022년 12월 18일
0

학습범위: 자료구조

자료구조, 리스트(list), 리스트와 for문/while문, enumerate()함수, 리스트 아이템 추가/삭제/연결/정렬, 튜플(tuple), 튜플 길이/결합/슬라이싱/정렬, 튜플과 for문/while문, 딕셔너리 조회/추가/수정/삭제, key(), values()

자료구조란?

컨테이너 자료형(여러 개의 데이터가 묶여있는 자료형)의 데이터 구조

파이썬의 대표적인 컨테이너 자료형으로는 리스트(List), 튜플(Tuple), 딕셔너리(Dic), 셋트(Set)가 있다.

#List
students = ['홍길동', '박찬호', '이용규', '김지은']

#Tuple
job = ('의사', '속기사', '전기기사', '감정평가사')

#Dic
scores = {'kor':88, 'eng':91, 'mat':95}

#Set
allSales = {100, 150, 90, 110}
중복된 데이터는 하나만 출력

리스트(List)

배열과 같이 여러 개의 데이터를 나열한 자료구조

'[]'를 이용해서 선언하고, 데이터 구분은 ','를 이용한다.

숫자, 문자(열), 논리형 등 모든 기본 데이터를 같이 저장할수 있다.

리스트에 또 다른 컨테이너 자료형 데이터를 저장할 수 있다.
data = [10, 20, 30 [40, 50, 60]]

인덱스(Index)

아이템에 자동으로 부여되는 번호표 (0부터 순차적으로 부여)
하나하나의 데이터에 접근하고 싶을때 유용하다.
리스트 아이템은 인덱스를 이용해서 조회 가능하다.

리스트 길이

리스트에 저장된 아이템 개수를 뜻한다.
len()과 반복문을 이용하면 리스트 아이템 조회가 가능하다.

for i in range (len(student)):
	print('students[{}] : {}'.format(i, student[i]))

for문을 이용한 조회

과락 과목 출력하기

minScore = 60
score= [
	['국어', 58]
    ['영어', 77]
    ['수학', 89]

#1
for item in scores:
	if item[1] < minScore:
    	print('과락 과목: {}, 점수: {}'.format(item[0], item[1]))
        
#2
for subject, score in scores:
	if score < minScore:
    	print('과락 과목: {}, 점수: {}.format(subject, score))

#3
for subject, score in scores:
	if score >= minscore: continue
    print('과락 과목: {}, 점수: {}'.format(subject, score))

while문을 이용한 조회

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

#1
n = 0
while n < len(cars):
	print(cars[n])
    n += 1
    
#2
n = 0
flag = True
while flag:
	print(car[n])
    n += 1
    
	if n == len(cars):
	flag = False
    
#3
n = 0
while True:
	print(car[n])
    n += 1
    
	if n == len(cars):
    	break

과락 과목 출력하기

minScore = 60
score= [
	['국어', 58]
    ['영어', 77]
    ['수학', 89]
    
#1
n = 0
while n < len(score):
	if score[n][1] < minScore:
    	print('과락 과목: {}, 점수: {}'.format(score[n][0], score[n][1]))
    n += 1
    
#2
n = 0
while n < len(score):
	if score[n][1] >= minScore:
		n += 1
    	continue
    
    print('과락 과목: {}, 점수: {}'.format(score[n][0], score[n][1]))
    n += 1

enumerate()

enumerate()함수를 이용하면 아이템을 열거할 수 있다.

sports = ['농구', '축구', '마라톤', '테니스']

#기존
for i in range(len(sports)):
	print('{} : {}'.format(i, sports[i])

# enumerate()함수 이용
for idx, value in enumerate(sports):
	print('{} : {}'.format(idx, value))

enumerate()는 문자열에도 적용할 수 있다.

str = 'Helllo python'
for idx, value in enumerate(str):
	print('{} : {}'.format(idx, value))

실습1) 가장 좋아하는 스포츠가 몇 번째에 있는지 출력하는 프로그램을 만들어보자.

sports = ['농구', '축구', '마라톤', '테니스']
favoritSport = input('가장 좋아하는 스포츠 입력: ')

sportIdx = 0
for idx, value in enumerate(sports):
	if value == favoritSport:
    	sportIdx = idx + 1
        
print('{}(은)는 {}번째에 있습니다.'.format(favoritSport, sportIdx))
가장 좋아하는 스포츠 입력: 마라톤
마라톤(은)는 4번째에 있습니다.

실습2) 사용자가 입력한 문자열에서 공백의 개수를 출력해보자.

message = input('메시지 입력: ')
cnt = 0
for idx, value in enumerate(message):
	if value == ' ' :
        cnt += 1
        
print('공백 개수 : {}'.format(cnt))

append()

append() 함수를 이용하면 마지막 인덱스에 아이템을 추가할 수 있다.

실습1) 가족 구성원의 나이가 아래와 같을 때 새로 태어난 동생을 리스트에 추가해보자.

myFaily = [['아빠', 40], ['엄마', 38], ['나', 9]]
myFaily.append(['동생', 1])

for name, age in myFaily:
	print('{}의 나이: {}'.format(name, age))
아빠의 나이: 40
엄마의 나이: 38
나의 나이: 9
동생의 나이: 1

insert()

insert() 함수를 이용하면 특정 위치(인덱스)에 아이템을 추가할 수 있다.

words = [ 'I', 'a', 'boy.']
words.insert(1, 'am')

for i in words:
	print('{} '.format(i), end='')
I am a boy.

pop()

pop() 함수를 이용하면 마지막 인덱스에 해당하는 아이템을 삭제할 수 있다.
pop(n) 함수를 이용하면 n인덱스에 해당하는 아이템을 삭제할 수 있다.

number = [10, 20, 30, 33, 40, 50]
number.pop(3) #인덱스를 이용하여 삭제
print('숫자:{}'.format(number))
숫자:[10, 20, 30, 40, 50]

remove()

remove() 함수를 이용하면 특정 아이템을 삭제할 수 있다.

number = [10, 20, 30, 33, 40, 50]
number.remove(33) #특정 아이템을 삭제
print('숫자:{}'.format(number))
숫자:[10, 20, 30, 40, 50]

remove()는 한 개의 아이템만 삭제 가능하다.
만약 삭제하려는 데이터가 2개 이상이라면 while문을 이용하자.

number = [10, 20, 30, 33, 40, 50, 33]

while 33 in number:
    number.remove(33)
    
print(number)
[10, 20, 30, 40, 50]

extend()

extend() 함수를 이용하면 리스트에 또 다른 리스트를 연결(확장)할 수 있다.

group1 = [1, 2, 3]
group2 = [4, 5, 6]
group1.extend(group2)

print(group1)
print(group2)
[1, 2, 3, 4, 5, 6]
[4, 5, 6]

덧셈 연산자를 이용해서 리스트를 연결할 수도 있다.

group1 = [1, 2, 3]
group2 = [4, 5, 6]
total = group1 + group2

print(group1)
print(group2)
print(total)
[1, 2, 3]
[4, 5, 6]
[1, 2, 3, 4, 5, 6]

sort()

sort() 함수를 이용하면 아이템을 정렬할 수 있다.

오름차순
sort()
sort(reverse=False)

내림차순
sort(reverse=True)

reverse()

reverse() 함수를 이용하면 아이템 순서를 뒤집을 수 있다.

num = [1, 2, 3, 4, 5, 6]
num.reverse()
print(num)
[6, 5, 4, 3, 2, 1]

그냥 참고

num = '12345'
list = []

for i in num:
    list.append(i)

print(list)
['1', '2', '3', '4', '5']

리스트 슬라이싱

[n:m]

[n:m]을 이용하면 리스트에서 원하는 아이템만 뽑아낼 수 있다.
[n:m]을 이용하면 문자열도 슬라이싱이 가능하다.

[2:4] → 인덱스 2<=n<4 라는 의미

num = [1, 2, 3, 4, 5]

print(num[2:4])
# 결과: [3, 4]

슬라이싱할 때 단계를 설정할 수 있다.

num = [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(num[2:-2])
# 결과: [3, 4, 5, 6, 7]
print(num[2:-2:3])
# 결과: [3, 6]
print(num[::2])
# 결과: [1, 3, 5, 7, 9]

슬라이싱을 이용해서 아이템을 변경할 수 있다.

num = [1, 2, 3, 7, 8, 9]

num[3:6] = 4, 5, 6
print(num)

#결과: [1, 2, 3, 4, 5, 6]

slice()

slice() 함수를 이용해서 아이템을 슬라이싱할 수 있다.

num = [1, 2, 3, 4, 5]

print(num[slice(2, 4)])

#결과: [3, 4]

리스트 곱셈 연산

리스트를 곱셈 연산하면 아이템이 반복된다.

num = [1, 2, 3]
numMul = num * 3
print(numMul)

#결과: [1, 2, 3, 1, 2, 3, 1, 2, 3]

index(item)

index(item) 함수를 이용하면 인덱스를 알아낼 수 있다.

korean = ['가', '나', '다']
searchIdx = korean.index('나')
print(searchIdx)

#결과: 1

count()

count() 함수를 이용하면 특정 아이템의 개수를 알아낼 수 있다.

korean = ['가', '나', '다', '나']
searchCnt = korean.count('나')
print(searchCnt)

#결과: 2

del 키워드

del 키워드를 이용하면 특정 아이템을 삭제할 수 있다.

korean = ['가', '나', '다', '나']
del korean[3]
print(korean)

#결과: ['가', '나', '다']

튜플(Tuple)

'()'을 이용해서 선언하고, 데이터 구분은 ','를 이용한다.
숫자, 문자(열), 논리형 등 모든 기본 데이터를 같이 저장할 수 있다.
튜플에 또 다른 컨테이너 자료형 데이터를 저장할 수 있다.
data = (10, 20, 30, (40, 50))

리스트와 비슷하지만 아이템 변경(수정, 삭제 등)이 불가하다.

튜플 아이템은 인덱스를 이용해서 조회 가능하다.

in, not in 키워드

in, not in 키워드를 이용하면 아이템 존재유/무를 알 수 있다.

studentTuple = ('홍길동', '박찬호', '김지은')

searchName = input('학생 이름 입력: ')
if searchName in studentTuple:
    print('우리반 학생입니다.')
else:
    print('우리반 학생이 아닙니다.')
학생 이름 입력: 홍길동
우리반 학생입니다.

in, not in 키워드는 문자열에서도 사용 가능하다.

pythonStr = '안녕하세요. 오늘은 2022년 12월 19일 월요일입니다.'
print('안녕' in pythonStr)

#결과: True

덧셈 연산자를 이용하여 두 개의 튜플을 결합 할 수 있다.

딕셔너리(Dictionary)

키(Key)와 값(value)을 이용해서 자료를 관리한다.
딕셔너리에는 인덱스가 존재하지 않으며, 키가 이를 대신한다.
키는 중복되지 않게 설정해야 한다.

'{}'를 이용해서 선언하고, '키'값의 형태로 아이템을 정의한다.

student = {'s1:'홍길동', 's2':'박찬호', 's3':'김지은')

info = {'이름':'홍길동', '나이':20, '학년':1}

key와 value에는 숫자, 문자(열), 논리형 뿐만 아니라 컨테이너 자료형도 올수 있다.
단, key에 immutable 값(변경이 불가능한 데이터 ex. 튜플O)은 올수 있지만 mutable(변경될수 있는 값 ex. 리스트X) 값은 올 수 없다.

딕셔너리 조회

딕셔너리는 키(key)를 이용해서 값(value)을 조회한다.

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
print('이름:{}'.format(student['s1']))
print(student['s3'])
이름:홍길동
김지은

존재하지 않는 키를 이용하여 조회 시 에러(error)가 발생한다.

get()를 이용한 조회

get()을 이용해서 value을 조회할 수 있다.

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
print('이름:{}'.format(student.get('s1')))
print(student.get('s3'))
이름:홍길동
김지은

get()은 존재하지 않는 키를 이용해도 에러가 발생하지 않는다.

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
print(student.get('s7'))
None

딕셔너리 추가

'딕셔너리이름[key] = value'의 형태로 아이템을 추가한다.

info = {}

info['이름'] = '홍길동'
info['나이'] = '20'
info['학년'] = '1학년'

print(f'info : {info}')
info : {'이름': '홍길동', '나이': '20', '학년': '1학년'}

추가하려는 키가 이미 존재한다면 기존의 값이 변경된다.

딕셔너리 수정

'딕셔너리이름[key] = value'의 형태로 아이템을 수정한다.

keys()와 values()

전체 키와 값을 조회할 수 있다.

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}

num = student.keys()
name = student.values()
whole = student.items()

print(f'번호 : {num}')
print(f'이름 : {name}')
print(f'전체 : {whole}')
번호 : dict_keys(['s1', 's2', 's3'])
이름 : dict_values(['홍길동', '박찬호', '김지은'])
전체 : dict_items([('s1', '홍길동'), ('s2', '박찬호'), ('s3', '김지은')])

리스트로 변환하기

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
num = student.keys()
name = student.values()
whole = student.items()

#리스트로 변환하기
lNum = list(num)
lName = list(name)
lWhole = list(whole)

#변환된 리스트 출력
print(lNum)
print(lName)
print(lWhole)
['s1', 's2', 's3']
['홍길동', '박찬호', '김지은']
[('s1', '홍길동'), ('s2', '박찬호'), ('s3', '김지은')]

(이미지 3)

딕셔너리 삭제

del과 pop()을 이용해서 item을 삭제할 수 있다.

del과 key를 이용한 아이템 삭제

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
del student['s3']
print(student)
{'s1': '홍길동', 's2': '박찬호'}

pop()과 key를 이용한 아이템 삭제

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
delValue = student.pop('s3')
print(student)
print(delValue)
{'s1': '홍길동', 's2': '박찬호'}
김지은

딕셔너리 유용한 기능

in,not in

키의 존재 유/무를 판단한다.

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
print('s1' in student)
print('s7' not in student)
True
True

len()

딕셔너리 길이(아이템 개수)를 알 수 있다.

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
print(len(student))
3

clear()

모든 아이템을 삭제한다.

student = {'s1':'홍길동', 's2':'박찬호', 's3':'김지은'}
student.clear()
print(student)
{}

실습(1) 개인 정보에 '연락처'와 '주민등록번호'가 있다면 삭제하는 코드를 작성해보자.

info = {'이름':'홍길동', '나이': 20, '연락처': '010-1234-5678', '주민등록번호': '123450-6789000'}

delItem = ['연락처', '주민등록번호']

for item in delItem:
    if(item in info):
        del info[item]

print(info)
{'이름': '홍길동', '나이': 20}
profile
데이터 입문자

0개의 댓글