본문 바로가기
Python 기초

[Python] 자료구조 정리

by 내 코딩 2023. 3. 19.
반응형

리스트

리스트 생성하기

변수마다 값을 하나씩 넣었던 것과 달리 리스트는 값을 여러 개 넣을 수 있다.

하나의 변수가 하나의 값을 가질 수 있었다면 하나의 리스트는 여러 값을 가질 수 있다.

각 값의 자료형은 다를 수 있다.

subway = [10, 20, 30]
print(subway)

이렇게 하면 subway1, subway2, subway3 변수를 사용할 필요 없이 리스트 하나에 저장할 수 있다.

값 추가/삽입/삭제하기

문자열에서 인덱스는 데이터의 위치를 나타냅니다.

리스트에서도 인덱스로 리스트에 저장한 데이터의 위치를 표시합니다.

subway = ['푸', '피글렛', '티거']
print(subway.index('피글렛'))  # 피글렛이 몇 번째 칸에 탔는가?

>> 1

 

append() 함수는 리스트 끝에 값을 추가한다.

append(추가할 값)
subway.append('이요르')
print(subway)

>> ['푸', '피글렛', '티거', '이요르']

 

insert() 함수는 중간에 값을 삽입할 수 있다.

insert(인덱스, 삽입할 값)
subway.insert(1, '루')
print(subway)

>> ['푸', '루', '피글렛', '티거', '이요르']

 

pop() 함수는 리스트 끝에서부터 값을 하나씩 꺼내어 반환한 뒤 삭제한다.

subway.pop()
print(subway)

subway.pop()
print(subway)

subway.pop()
print(subway)

>> ['푸', '루', '피글렛', '티거'] 
>> ['푸', '루', '피글렛'] 
>> ['푸', '루']

 

clear() 함수로 리스트의 모든 값을 지울 수 있다.

subway.clear()
print(subway)

>> []

중복 값 확인하기

count()함수를 사용하여 리스트 안에 같은 값이 몇 개 인지 확인할 수 있습니다.

subway = ['푸', '피글렛', '티거']
subway.append('푸')
print(subway)
print(subway.count('푸'))

>> ['푸', '피글렛', '티거', '푸']
>> 2

리스트 정렬하기

sort() 함수를 사용하여 뒤섞인 숫자를 오름차순으로 정렬할 수 있습니다.

sort() 함수 안에 reverse를 추가하면 내림차순으로 정렬할 수 있습니다.

reverse() 함수를 통해 값의 순서를 거꾸로 뒤집을 수 있습니다.

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

num_list.sort()  # 오름차순 정렬
print(num_list)

num_list.sort(reverse=True)  # 내림차순 정렬
print(num_list)

num_list.reverse()  # 순서 뒤집기
print(num_list)

sorted()로 리스트 정렬하기

sort() 함수는 정렬하면서 리스트 자체의 값을 변경하지만, sorted() 함수는 원본 리스트 변경 없이 정렬된 리스트를 새로 생성한다.

my_list = [1, 3, 2]
my_list.sort()  # 리스트 정렬
print(my_list)  # my_list 리스트 데이터 변경

your_list = [1, 3, 2]
new_list = sorted(your_list)  # 정렬할 리스트를 소괄호 안에 넣음
print(your_list)  # your_list 리스트 데이터는 변경되지 않음
print(new_list)  # 정렬된 새로운 리스트

>> [1, 2, 3]
>> [1, 3, 2]
>> [1, 2, 3]

리스트 확장하기

리스트에 반드시 같은 자료형의 값만 넣을 필요는 없다.

정수형, 실수형, 문자열, 불 형, 리스트도 집어넣을 수 있다.

리스트1.extend(리스트2)
mix_list = ['푸', 20, True]
num_list = [5, 2, 4, 3, 1]
num_list.extend(mix_list)  # 리스트 합치기
print(mix_list)
print(num_list)

>> ['푸', 20, True]
>> [5, 2, 4, 3, 1, '푸', 20, True]

딕셔너리

딕셔너리 생성하기

딕셔너리는 중괄호로 감싸서 정의한다. 

key와 value는 콜론(:)으로 구분하고, key와 value 한 쌍으로 이루어진 각 값은 리스트와 마찬가지로 쉼표로 구분한다.

key는 중복을 허용하지 않으므로 유일한 값으로 설정해야 한다.

딕셔너리명 = {key: value1, key2: value2, ... }
cabinet = {3: '푸', 100: '피글렛'}
print(cabinet[3])
print(cabinet[100])

>> 푸

>> 피글렛

변수나 리스트가 인덱스로 값에 접근한다면 딕셔너리는 인덱스 역할을 key가 한다.

딕셔너리명에 대괄호를 붙이고 그 안에 key를 넣으면 key에 해당하는 value에 접근할 수 있다.

print(cabinet.get(3))

>> 푸

get(key, default=None)

대괄호 대신 get() 함수를 사용해도 알 수 있다.

대괄호를 사용할 때와 get()함수의 결과가 완전히 같지는 않다.

대괄호를 사용할 때 만약 정의되지 않은 key를 전달하면 오류가 발생하고 프로그램을 바로 종료한다.

그러나 get() 함수를 사용하면 정의되지 않은 key를 전달하더라도 오류가 발생하지 않고, None을 출력한다. 

그리고 프로그램은 계속 실행된다.

print(cabinet.get(5))
print('hi')
print(cabinet[5])
print('hi')

>> None
>> hi

>> KeyError : 5

print(cabinet.get(5, '사용 가능'))  # key에 해당하는 값이 없으면 기본값을 사용하게 함

>> 사용 가능

get() 함수는 다른 기능도 있다. 5번 사물함은 아직 사용자가 없으니 이름 대신 '사용 가능' 이라는 기본값으로 설정하고 싶다.

이럴 때 get() 함수를 사용한다.

get() 함수로 기본값을 설정하면 5번 열쇠를 누군가 사용하기 전까지, 즉 key 5에 해당하는 value를 정의하기 전까지는 '사용 가능'으로 나온다.

 

사물함이 사용 중인지도 확인할 수 있다. key가 딕셔너리에 있는지 확인하면 되는데, 이럴 때 in 연산자를 사용한다.

print(3 in cabinet)
print(5 in cabinet)

>> True

>> False

 

key에는 정수형 뿐만 아니라 문자열도 넣을 수 있다.

cabinet = {'A-3': '푸', 'B-100': '피글렛'}
print(cabinet['A-3'])
print(cabinet['B-100'])

>> 푸

>> 피글렛

in 연산자

in 연산자는 문자열에 해당 글자가 포함됐는지 확인할 때도 사용할 수 있다.

print('곰' in '곰돌이')
print('돌이' in '곰돌이')
print('푸' in '곰돌이')

>> True

>> True

>> False

값 변경/추가/삭제하기

cabinet = {'A-3': '푸', 'B-100': '피글렛'}
print(cabinet)
cabinet['A-3'] = '티거'  # key에 해당하는 값이 있을 때 -> 값 변경
cabinet['C-20'] = '이요르'  # key에 해당하는 값이 없을 때 -> 값 추가
print(cabinet)

>> {'A-3': '푸', 'B-100': '피글렛'}
>> {'A-3': '티거', 'B-100': '피글렛', 'C-20': '이요르'}

key에 해당하는 값이 있으면 key를 유지하면서 기존 value를 새로운 value로 변경한다.

key에 해당하는 값이 없으면 key와 value 한 쌍으로 된 값을 딕셔너리에 새로 추가한다.

del cabinet['A-3']  # key 'A-3'에 해당하는 값 삭제
print(cabinet)

>> {'B-100': '피글렛', 'C-20': '이요르'}

del 키워드를 사용해서 key에 해당하는 값을 삭제할 수 있다.

값 확인하기

print(cabinet.keys())  # key만 출력
print(cabinet.values())  # value만 출력
print(cabinet.items())  # key, value 한 쌍으로 출력
cabinet.clear()
print(cabinet)

>> dict_keys(['B-100', 'C-20'])
>> dict_values(['피글렛', '이요르'])
>> dict_items([('B-100', '피글렛'), ('C-20', '이요르')])
>> {}

튜플

튜플은 리스트와 달리 처음 정의할 때를 제외하고 값의 변경이나 추가, 삭제 등이 불가능하다.

그래서 값의 순서도 바뀔 수 없다. 그 대신 리스트보다 속도가 빠르다.

튜플명 = (값1, 값2, ... )
menu = ('돈가스', '치즈돈가스')
print(menu[0])
print(menu[1])

>> 돈가스
>> 치즈돈가스

 

값이 다른 변수를 정의한다.

name = '피글렛'
age = 20
hobby = '코딩'
print(name, age, hobby)

>> 피글렛 20 코딩,

 

변수를 여러 줄에 따로 정의하는 대신 튜플 형태로 한 줄에 여러 변수의 값을 정의할 수도 있다.

(name, age, hobby) = '피글렛', 20, '코딩'
print(name, age, hobby)

>> 피글렛 20 코딩

 

세트

세트는 중복을 허용하지 않고, 데이터 순서도 보장하지 않는다.

수학에서 집합을 표현할 때처럼 값을 쉼표(,)로 구분하고 중괄호로 정의한다.

세트명 = {값1, 값2, ...}
my_set = {1, 2, 3, 3, 3}
print(my_set)

>> {1, 2, 3}

중괄호 대신 set()로 정의하는 방법도 있다.

java = {'푸', '피글렛', '티거'}  # 자바 개발자 세트
python = set(['푸', '이요르'])  # 파이썬 개발자 세트
빈 세트 생성하기
아무 값이 없는 빈 세트를 만들고 이후에 값을 추가하려는 경우에는 세트를 다음과 같이 생성한다.
empty_set = set()

수학에서 집합의 성질 중 두 집합에서 공통 값을 뽑아내는 교집합이 있다.

세트에서도 같은 기능을 하는 & 기호와 intersection() 함수가 있다.

# 교집합(자바와 파이썬을 모두 다룰 수 있는 개발자)
print(java & python)
print(java.intersection(python))

>> {'푸'}
>> {'푸'}

 

두 집합을 합치는 합집합 기능은 |(파이프, pipe) 기호나 union() 함수를 이용한다.

# 합집합(자바 또는 파이썬을 다룰 수 있는 개발자)
print(java | python)
print(java.union(python))

>> {'푸', '이요르', '피글렛', '티거'}
>> {'푸', '이요르', '피글렛', '티거'}

세트의 출력 순서
세트는 데이터의 순서를 보장하지 않는다. 그래서 세트에 저장한 값을 출력하면 실행할 때마다 결과가 달라진다.

 

차집합은 - 기호 또는 difference() 함수를 사용한다.

# 차집합(자바는 할 수 있지만 파이썬은 할 줄 모르는 개발자)
print(java - python)
print(java.difference(python))

>> {'피글렛', '티거'}
>> {'피글렛', '티거'}

 

집합에 추가할 때는 add() 함수를 사용한다.

# 파이썬 개발자 추가(기존 개발자: 푸, 이요르)
python.add('피글렛')
print(python)

>> {'이요르', '피글렛', '푸'}

 

집합에서 제외할 때는 remove() 함수를 사용한다.

# 자바 개발자 삭제(기존 개발자: 푸, 피글렛, 티거)
java.remove('피글렛')
print(java)

>> {'티거', '푸'}

자료구조 변환하기

menu = {'커피', '우유', '주스'}
print(menu)
print(type(menu))

>> {'우유', '주스', '커피'}
>> <class 'set'>

menu = list(menu)
print(menu, type(menu))

>> ['우유', '주스', '커피'] <class 'list'>

menu = tuple(menu)
print(menu, type(menu))

>> ('우유', '주스', '커피') <class 'tuple'>

menu = set(menu)
print(menu, type(menu))

>> {'우유', '주스', '커피'} <class 'set'>

 

셀프체크

문제 : 나도대학교에서 수강신청 기간에 시스템 오류로 일부 과목이 중복 신청되는 문제가 발생했습니다. 중복 과목을 없애는 프로그램을 작성하세요.

 

조건

1. 신청 과목은 리스트로 관리된다.

2. 리스트에 같은 과목이 2번 이상 포함된 경우 1개만 남기고 나머지는 삭제한다.

3. 출력 신청 과목의 순서는 변경해도 괜찮다.

subject = ['자료구조', '알고리즘', '자료구조', '운영체제']
subject = set(subject)
subject = list(subject)
print('신청한 과목은 다음과 같습니다.')
print(subject)

 

'Python 기초' 카테고리의 다른 글

[Python] 함수 정리  (0) 2023.03.22
[Python] 제어문 정리  (0) 2023.03.19
[Python] 문자열 다루기  (0) 2023.03.18
[Python] 연산자 정리  (0) 2023.03.17
[Python] 자료형과 변수  (1) 2023.03.10

댓글