"4. 자료구조"의 두 판 사이의 차이
(새 문서: 자료구조에 대한 문서. 분류:기초) |
잔글 (→공통) |
||
(사용자 4명의 중간 판 15개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
자료구조에 대한 문서. | 자료구조에 대한 문서. | ||
+ | <youtube>https://www.youtube.com/watch?v=k34COoOs9mc</youtube> | ||
+ | |||
+ | == 개요 == | ||
+ | 여러 개의 자료형들을 담기 위한 구조. 반복자료형이라 부르기도 한다. | ||
+ | |||
+ | ===형태=== | ||
+ | {| class="wikitable" | ||
+ | !자료구조 | ||
+ | !설명 | ||
+ | !예시 | ||
+ | |- | ||
+ | |리스트 | ||
+ | |순서가 있는 객체의 집합. | ||
+ | 대괄호로 구분 [] | ||
+ | |||
+ | 배열이라고도 한다. | ||
+ | |리스트명 = [1,2,3,4,5,...] | ||
+ | 이차원배열 = [[1,2,3,4], [3,4,5,6]] | ||
+ | |- | ||
+ | |튜플 | ||
+ | |순서가 있는 객체의 집합. | ||
+ | 리스트와 달리 변경이 불가능한 구조이다. 대신 리스트보다 빠르다. | ||
+ | |||
+ | 데이터의 불변성이 중요할 경우 사용. | ||
+ | |튜플명 = (1,2,3,4,5, ...) | ||
+ | |- | ||
+ | |딕셔너리 | ||
+ | |순서가 없는 객체의 집합. | ||
+ | 인덱스가 아닌, 키워드와 1대1 대응을 시켜둔 자료구조. | ||
+ | |사전명 = {"key1":value, "key2":value, ...} | ||
+ | |- | ||
+ | |집합 | ||
+ | |중복이 없는 원소집합. 중복된 걸 생성해도 하나만 존재한다. | ||
+ | 원소가 순서대로 저장되는 것이 아닌, 오름차순으로 재배치된다. | ||
+ | |집합명 = {'a', 'b', ...} | ||
+ | |} | ||
+ | ==사용법== | ||
+ | 자료구조 안에 자료구조를 넣어 보다 높은 차원의 자료구조를 만들 수 있다. | ||
+ | {| class="wikitable" | ||
+ | ! | ||
+ | !리스트 | ||
+ | !튜플 | ||
+ | !딕셔너리 | ||
+ | |- | ||
+ | |정의 | ||
+ | |리스트명 = [데이터] | ||
+ | |튜플명 = (데이터) | ||
+ | |<code>사전명 = {"key1":value, "key2":value, ...}</code> | ||
+ | |- | ||
+ | |자료접근 | ||
+ | |리스트명[인덱스] | ||
+ | 0부터 시작한다. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | 리스트명[-1] 형태로 뒤에서부터 접근 가능. | ||
+ | |||
+ | 여러 차원으로 되어있는 경우, 리스트명[1][2][0] 형태로 접근 가능 | ||
+ | |리스트와 동일 | ||
+ | |키에 접근하면 된다. | ||
+ | {| class="wikitable" | ||
+ | |+ | ||
+ | !방법 | ||
+ | !설명 | ||
+ | |- | ||
+ | |사전명["키"] | ||
+ | |값이 없으면 에러 발생 | ||
+ | |- | ||
+ | |사전명.get("키") | ||
+ | |값이 없으면 None 반환 | ||
+ | |} | ||
+ | |- | ||
+ | |여러 | ||
+ | 자료접근 | ||
+ | |문자열의 슬라이싱과 동일하다. | ||
+ | 리스트명[시작번호:끝번호] #시작번호와 같은 것부터 끝번호보다 작은 것까지 가져온다. | ||
+ | |||
+ | <nowiki>리스트명[ :5], 리스트명[-1: ] 형태로 사용도 가능.</nowiki> | ||
+ | |리스트와 동일 | ||
+ | |사전은 기본적으로 순서가 없지만, 생성 시 객체=OrderedDict() 으로 만들면 순서를 갖는다. | ||
+ | 순서 있는 사전을 사용하면 for문 등에서 순서대로 실행도 가능하다. | ||
+ | |- | ||
+ | |자료찾기 | ||
+ | |찾을 자료가 어디에 있는지 인덱스번호를 얻는다. | ||
+ | {| class="wikitable" | ||
+ | !방법 | ||
+ | !설명 | ||
+ | |- | ||
+ | |리스트명.index(자료) | ||
+ | |가장 뒤에 추가한다. | ||
+ | |- | ||
+ | | | ||
+ | | | ||
+ | |} | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | |자료추가 | ||
+ | |다음의 방법으로 추가한다. | ||
+ | {| class="wikitable" | ||
+ | |+ | ||
+ | !방법 | ||
+ | !설명 | ||
+ | |- | ||
+ | |리스트명.append(데이터) | ||
+ | |가장 뒤에 추가한다. | ||
+ | |- | ||
+ | |리스트명.insert(인덱스, 데이터) | ||
+ | |인덱스에 해당하는 자리에 추가한다. | ||
+ | 뒤의 데이터들을 하나씩 밀어서 끼워넣는다. | ||
+ | |- | ||
+ | | | ||
+ | | | ||
+ | |} | ||
+ | |튜플에선 불가 | ||
+ | |키에 해당하는 데이터는 다음과 같이 넣을 수 있다. | ||
+ | 사전명["키"]=데이터 | ||
+ | |- | ||
+ | |자료수정 | ||
+ | |해당 데이터 위치에 데이터를 대입하면 된다. | ||
+ | <code>리스트명[3]=데이터</code> 형태로 명령하면 4번째 데이터가 수정된다. | ||
+ | |튜플에선 불가 | ||
+ | |해당하는 키에 대입하면 수정된다. | ||
+ | 사전명["키"]=데이터 | ||
+ | |- | ||
+ | |자료삭제 | ||
+ | |인덱스를 사용하느냐, 값을 사용하느냐에 따라 두 가지로 나눈다. | ||
+ | {| class="wikitable" | ||
+ | !방법 | ||
+ | !설명 | ||
+ | |- | ||
+ | |del 리스트명[인덱스] | ||
+ | |해당하는 데이터를 지운다. | ||
+ | |- | ||
+ | |리스트명.remove(데이터) | ||
+ | |데이터에 해당하는 값을 지운다. | ||
+ | |} | ||
+ | |튜플에선 불가 | ||
+ | | | ||
+ | {| class="wikitable" | ||
+ | !방법 | ||
+ | !설명 | ||
+ | |- | ||
+ | |del 사전명[인덱스] | ||
+ | |해당하는 데이터를 지운다. | ||
+ | |} | ||
+ | |- | ||
+ | |구조변경 | ||
+ | |list(자료구조) 형태로 다른 자료구조를 리스트로 만들 수 있다. | ||
+ | |tuple(자료구조) | ||
+ | | | ||
+ | |} | ||
+ | ==자료파악== | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !설명 | ||
+ | |- | ||
+ | |자료의 경우, 그 길이를 파악하고, | ||
+ | 자료구조의 경우, 자료의 개수를 파악한다. | ||
+ | |len(데이터) | ||
+ | |} | ||
+ | =자료조작= | ||
+ | ==리스트 관련== | ||
+ | 튜플에선 수정이 불가능해 쓸 수 없고, 딕셔너리에선 의미없는 방식이다. | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !설명 | ||
+ | ! | ||
+ | |- | ||
+ | |오름차순으로 정렬한다.(내림차순은 리버스함수를 이용) | ||
+ | |리스트.sort() | ||
+ | | | ||
+ | |- | ||
+ | |리스트의 값을 역순으로 뒤집는다. | ||
+ | |리스트.reverse() | ||
+ | | | ||
+ | |} | ||
+ | {| class="wikitable" | ||
+ | |리스트명.pop(자료) | ||
+ | |데이터를 사용하고 지운다. | ||
+ | |} | ||
+ | |||
+ | === list와 json === | ||
+ | 다른 서비스나 서버로 데이터를 전달할 땐 json으로 변환하여 전달해야 한다.(각자 데이터를 처리하는 방식이 달라서..) | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |list를 json으로 | ||
+ | |사전을 json화 하는 것도 방법은 같다. | ||
+ | |json.dumps(list) | ||
+ | |- | ||
+ | |json을 list로 | ||
+ | |사실, json은 사전 구조와 같다. 사전으로 받아진다. | ||
+ | |json_data = json.loads(data) | ||
+ | |||
+ | 예시) json_data['키'] | ||
+ | |} | ||
+ | ==딕셔너리 관련== | ||
+ | ====데이터 추출==== | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !방법 | ||
+ | !설명 | ||
+ | |- | ||
+ | |키 값만 뽑아오고 싶다. | ||
+ | |사전명.keys() | ||
+ | |키값들을 리스트로 얻어온다. | ||
+ | |- | ||
+ | |자료값만 뽑아오고 싶다. | ||
+ | |사전명.values() | ||
+ | |자료값들을 리스트로 얻어온다. | ||
+ | |- | ||
+ | |둘을 한 쌍으로 뽑아오고 싶다. | ||
+ | |사전명.items() | ||
+ | |자료값 쌍을 2차원 리스트로 얻어온다. | ||
+ | 딕셔너리에서 for문을 사용하려면 items()를 사용해 다음과 같이 돌려야 한다.<syntaxhighlight lang="python"> | ||
+ | for key, value in 사전명.items(): | ||
+ | key + value... 등 조작. | ||
+ | </syntaxhighlight> | ||
+ | |- | ||
+ | |최소값을 갖는 인덱스 | ||
+ | |인덱스 = min(사전, key=사전.get) | ||
+ | | | ||
+ | |} | ||
+ | ====딕셔너리 조작==== | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !방법 | ||
+ | !설명 | ||
+ | |- | ||
+ | |두 사전을 합치고 싶다. | ||
+ | |{**사전명1, **사전명2} | ||
+ | |뒤의 내용을 앞의 사전에 덮어씌운다.(키가 겹치는 경우, 키가 없다면 추가한다.) | ||
+ | |} | ||
+ | ==집합 관련== | ||
+ | 정의하려면 <code>집합명 = {}</code> 이 아닌, <code>집합명 = set()</code> 형태로 정의해야 한다. 앞처럼 하면 빈 사전이 생성된다. | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !방법 | ||
+ | !설명 | ||
+ | |- | ||
+ | |교집합 찾기 | ||
+ | |집합명1 & 집합명2 | ||
+ | |두 집합에 동시에 들어간 원소들만 얻어진다. | ||
+ | |- | ||
+ | |합집합 찾기 | ||
+ | |<nowiki>집합명1 | 집합명2</nowiki> | ||
+ | |파이프연산자를 통해 두 집합의 합집합을 구한다. | ||
+ | |- | ||
+ | |차집합 | ||
+ | |집합명1 - 집합명2 | ||
+ | |집합1에서의 집합2의 차집합을 구한다.(교집합을 빼는 것과 동일) | ||
+ | |} | ||
+ | |||
+ | == 공통 == | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |새로운 리스트로 정렬 | ||
+ | |리스트, 문자열, 튜플 등 모두에서 사용 가능. 가존 반복자료형을 복사하여 새로운 리스트로 정렬한다.(기존 자료형은 유지.) | ||
+ | |sorted(자료형) | ||
+ | |- | ||
+ | |자료구조 합치기 | ||
+ | |자료구조끼리 합친다. | ||
+ | |자료구조.extend(자료구조) | ||
+ | |- | ||
+ | |자료구조 내의 데이터 데이터형 한번에 바꾸기 | ||
+ | |자료구조 안에 속한 데이터들의 데이터 type을 한번에 바꾼다.(for을 사용하기엔 번거로우니까.) | ||
+ | |list(map(변수형, 자료구조)) # 리스트로 반환 | ||
+ | tuple(map(변수형, 자료구조)) # 튜플로 반환 | ||
+ | |} | ||
+ | |||
+ | = 궁금 = | ||
+ | 리스트를 +로 합하면 어떻게 될까? | ||
+ | |||
+ | = 관련에러 = | ||
+ | |||
+ | === 'method' object is not subscriptable === | ||
+ | 사전에서 get을 쓰면 get('user')로 써야 하는데, get['user'] 등 괄호를 잘못 쓴 경우 발생하는 에러이다. | ||
+ | |||
+ | === django cannot unpack non-iterable object === | ||
+ | 튜플, 리스트를 변수로 받을 때 변수의 갯수와 자료구조 안의 데이터 갯수가 다를 경우에 발생한다. | ||
+ | |||
+ | 예를 들어 <code>변수1, 변수2 = (1)</code>에서 좌우의 데이터 갯수가 다른데, 이럴 때 발생한다. 이 경우엔 데이터 하나에 여러 변수를 대응시킬 때! | ||
[[분류:기초]] | [[분류:기초]] |
2023년 1월 17일 (화) 08:27 기준 최신판
자료구조에 대한 문서.
1 개요[편집 | 원본 편집]
여러 개의 자료형들을 담기 위한 구조. 반복자료형이라 부르기도 한다.
1.1 형태[편집 | 원본 편집]
자료구조 | 설명 | 예시 |
---|---|---|
리스트 | 순서가 있는 객체의 집합.
대괄호로 구분 [] 배열이라고도 한다. |
리스트명 = [1,2,3,4,5,...]
이차원배열 = [[1,2,3,4], [3,4,5,6]] |
튜플 | 순서가 있는 객체의 집합.
리스트와 달리 변경이 불가능한 구조이다. 대신 리스트보다 빠르다. 데이터의 불변성이 중요할 경우 사용. |
튜플명 = (1,2,3,4,5, ...) |
딕셔너리 | 순서가 없는 객체의 집합.
인덱스가 아닌, 키워드와 1대1 대응을 시켜둔 자료구조. |
사전명 = {"key1":value, "key2":value, ...} |
집합 | 중복이 없는 원소집합. 중복된 걸 생성해도 하나만 존재한다.
원소가 순서대로 저장되는 것이 아닌, 오름차순으로 재배치된다. |
집합명 = {'a', 'b', ...} |
2 사용법[편집 | 원본 편집]
자료구조 안에 자료구조를 넣어 보다 높은 차원의 자료구조를 만들 수 있다.
리스트 | 튜플 | 딕셔너리 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
정의 | 리스트명 = [데이터] | 튜플명 = (데이터) | 사전명 = {"key1":value, "key2":value, ...}
| ||||||||||
자료접근 | 리스트명[인덱스]
0부터 시작한다.
리스트명[-1] 형태로 뒤에서부터 접근 가능. 여러 차원으로 되어있는 경우, 리스트명[1][2][0] 형태로 접근 가능 |
리스트와 동일 | 키에 접근하면 된다.
| ||||||||||
여러
자료접근 |
문자열의 슬라이싱과 동일하다.
리스트명[시작번호:끝번호] #시작번호와 같은 것부터 끝번호보다 작은 것까지 가져온다. 리스트명[ :5], 리스트명[-1: ] 형태로 사용도 가능. |
리스트와 동일 | 사전은 기본적으로 순서가 없지만, 생성 시 객체=OrderedDict() 으로 만들면 순서를 갖는다.
순서 있는 사전을 사용하면 for문 등에서 순서대로 실행도 가능하다. | ||||||||||
자료찾기 | 찾을 자료가 어디에 있는지 인덱스번호를 얻는다.
|
||||||||||||
자료추가 | 다음의 방법으로 추가한다.
|
튜플에선 불가 | 키에 해당하는 데이터는 다음과 같이 넣을 수 있다.
사전명["키"]=데이터 | ||||||||||
자료수정 | 해당 데이터 위치에 데이터를 대입하면 된다.
|
튜플에선 불가 | 해당하는 키에 대입하면 수정된다.
사전명["키"]=데이터 | ||||||||||
자료삭제 | 인덱스를 사용하느냐, 값을 사용하느냐에 따라 두 가지로 나눈다.
|
튜플에선 불가 |
| ||||||||||
구조변경 | list(자료구조) 형태로 다른 자료구조를 리스트로 만들 수 있다. | tuple(자료구조) |
3 자료파악[편집 | 원본 편집]
의도 | 설명 |
---|---|
자료의 경우, 그 길이를 파악하고,
자료구조의 경우, 자료의 개수를 파악한다. |
len(데이터) |
4 자료조작[편집 | 원본 편집]
4.1 리스트 관련[편집 | 원본 편집]
튜플에선 수정이 불가능해 쓸 수 없고, 딕셔너리에선 의미없는 방식이다.
의도 | 설명 | |
---|---|---|
오름차순으로 정렬한다.(내림차순은 리버스함수를 이용) | 리스트.sort() | |
리스트의 값을 역순으로 뒤집는다. | 리스트.reverse() |
리스트명.pop(자료) | 데이터를 사용하고 지운다. |
4.1.1 list와 json[편집 | 원본 편집]
다른 서비스나 서버로 데이터를 전달할 땐 json으로 변환하여 전달해야 한다.(각자 데이터를 처리하는 방식이 달라서..)
의도 | 설명 | 방법 |
---|---|---|
list를 json으로 | 사전을 json화 하는 것도 방법은 같다. | json.dumps(list) |
json을 list로 | 사실, json은 사전 구조와 같다. 사전으로 받아진다. | json_data = json.loads(data)
예시) json_data['키'] |
4.2 딕셔너리 관련[편집 | 원본 편집]
4.2.1 데이터 추출[편집 | 원본 편집]
의도 | 방법 | 설명 |
---|---|---|
키 값만 뽑아오고 싶다. | 사전명.keys() | 키값들을 리스트로 얻어온다. |
자료값만 뽑아오고 싶다. | 사전명.values() | 자료값들을 리스트로 얻어온다. |
둘을 한 쌍으로 뽑아오고 싶다. | 사전명.items() | 자료값 쌍을 2차원 리스트로 얻어온다.
딕셔너리에서 for문을 사용하려면 items()를 사용해 다음과 같이 돌려야 한다.for key, value in 사전명.items():
key + value... 등 조작.
|
최소값을 갖는 인덱스 | 인덱스 = min(사전, key=사전.get) |
4.2.2 딕셔너리 조작[편집 | 원본 편집]
의도 | 방법 | 설명 |
---|---|---|
두 사전을 합치고 싶다. | {**사전명1, **사전명2} | 뒤의 내용을 앞의 사전에 덮어씌운다.(키가 겹치는 경우, 키가 없다면 추가한다.) |
4.3 집합 관련[편집 | 원본 편집]
정의하려면 집합명 = {}
이 아닌, 집합명 = set()
형태로 정의해야 한다. 앞처럼 하면 빈 사전이 생성된다.
의도 | 방법 | 설명 |
---|---|---|
교집합 찾기 | 집합명1 & 집합명2 | 두 집합에 동시에 들어간 원소들만 얻어진다. |
합집합 찾기 | 집합명1 | 집합명2 | 파이프연산자를 통해 두 집합의 합집합을 구한다. |
차집합 | 집합명1 - 집합명2 | 집합1에서의 집합2의 차집합을 구한다.(교집합을 빼는 것과 동일) |
4.4 공통[편집 | 원본 편집]
의도 | 설명 | 방법 |
---|---|---|
새로운 리스트로 정렬 | 리스트, 문자열, 튜플 등 모두에서 사용 가능. 가존 반복자료형을 복사하여 새로운 리스트로 정렬한다.(기존 자료형은 유지.) | sorted(자료형) |
자료구조 합치기 | 자료구조끼리 합친다. | 자료구조.extend(자료구조) |
자료구조 내의 데이터 데이터형 한번에 바꾸기 | 자료구조 안에 속한 데이터들의 데이터 type을 한번에 바꾼다.(for을 사용하기엔 번거로우니까.) | list(map(변수형, 자료구조)) # 리스트로 반환
tuple(map(변수형, 자료구조)) # 튜플로 반환 |
5 궁금[편집 | 원본 편집]
리스트를 +로 합하면 어떻게 될까?
6 관련에러[편집 | 원본 편집]
6.1 'method' object is not subscriptable[편집 | 원본 편집]
사전에서 get을 쓰면 get('user')로 써야 하는데, get['user'] 등 괄호를 잘못 쓴 경우 발생하는 에러이다.
6.2 django cannot unpack non-iterable object[편집 | 원본 편집]
튜플, 리스트를 변수로 받을 때 변수의 갯수와 자료구조 안의 데이터 갯수가 다를 경우에 발생한다.
예를 들어 변수1, 변수2 = (1)
에서 좌우의 데이터 갯수가 다른데, 이럴 때 발생한다. 이 경우엔 데이터 하나에 여러 변수를 대응시킬 때!