"4. 자료구조"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
잔글 (→‎공통)
 
(같은 사용자의 중간 판 7개는 보이지 않습니다)
15번째 줄: 15번째 줄:
 
|순서가 있는 객체의 집합.
 
|순서가 있는 객체의 집합.
 
대괄호로 구분 []
 
대괄호로 구분 []
 +
 +
배열이라고도 한다.
 
|리스트명 = [1,2,3,4,5,...]
 
|리스트명 = [1,2,3,4,5,...]
 +
이차원배열 = [[1,2,3,4], [3,4,5,6]]
 
|-
 
|-
 
|튜플
 
|튜플
79번째 줄: 82번째 줄:
 
<nowiki>리스트명[ :5], 리스트명[-1: ] 형태로 사용도 가능.</nowiki>
 
<nowiki>리스트명[ :5], 리스트명[-1: ] 형태로 사용도 가능.</nowiki>
 
|리스트와 동일
 
|리스트와 동일
|
+
|사전은 기본적으로 순서가 없지만, 생성 시 객체=OrderedDict() 으로 만들면 순서를 갖는다.
 +
순서 있는 사전을 사용하면 for문 등에서 순서대로 실행도 가능하다.
 
|-
 
|-
 
|자료찾기
 
|자료찾기
179번째 줄: 183번째 줄:
 
|리스트명.pop(자료)
 
|리스트명.pop(자료)
 
|데이터를 사용하고 지운다.
 
|데이터를 사용하고 지운다.
 +
|}
 +
 +
=== list와 json ===
 +
다른 서비스나 서버로 데이터를 전달할 땐 json으로 변환하여 전달해야 한다.(각자 데이터를 처리하는 방식이 달라서..)
 +
{| class="wikitable"
 +
!의도
 +
!설명
 +
!방법
 +
|-
 +
|list를 json으로
 +
|사전을 json화 하는 것도 방법은 같다.
 +
|json.dumps(list)
 +
|-
 +
|json을 list로
 +
|사실, json은 사전 구조와 같다. 사전으로 받아진다.
 +
|json_data = json.loads(data)
 +
 +
예시) json_data['키']
 
|}
 
|}
 
==딕셔너리 관련==
 
==딕셔너리 관련==
240번째 줄: 262번째 줄:
 
{| class="wikitable"
 
{| class="wikitable"
 
!의도
 
!의도
 +
!설명
 
!방법
 
!방법
!설명
 
 
|-
 
|-
 
|새로운 리스트로 정렬
 
|새로운 리스트로 정렬
 +
|리스트, 문자열, 튜플 등 모두에서 사용 가능. 가존 반복자료형을 복사하여 새로운 리스트로 정렬한다.(기존 자료형은 유지.)
 
|sorted(자료형)
 
|sorted(자료형)
|리스트, 문자열, 튜플 등 모두에서 사용 가능. 가존 반복자료형을 복사하여 새로운 리스트로 정렬한다.(기존 자료형은 유지.)
 
 
|-
 
|-
 
|자료구조 합치기
 
|자료구조 합치기
 +
|자료구조끼리 합친다.
 
|자료구조.extend(자료구조)
 
|자료구조.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] 형태로 접근 가능

리스트와 동일 키에 접근하면 된다.
방법 설명
사전명["키"] 값이 없으면 에러 발생
사전명.get("키") 값이 없으면 None 반환
여러

자료접근

문자열의 슬라이싱과 동일하다.

리스트명[시작번호:끝번호] #시작번호와 같은 것부터 끝번호보다 작은 것까지 가져온다.

리스트명[ :5], 리스트명[-1: ] 형태로 사용도 가능.

리스트와 동일 사전은 기본적으로 순서가 없지만, 생성 시 객체=OrderedDict() 으로 만들면 순서를 갖는다.

순서 있는 사전을 사용하면 for문 등에서 순서대로 실행도 가능하다.

자료찾기 찾을 자료가 어디에 있는지 인덱스번호를 얻는다.
방법 설명
리스트명.index(자료) 가장 뒤에 추가한다.
자료추가 다음의 방법으로 추가한다.
방법 설명
리스트명.append(데이터) 가장 뒤에 추가한다.
리스트명.insert(인덱스, 데이터) 인덱스에 해당하는 자리에 추가한다.

뒤의 데이터들을 하나씩 밀어서 끼워넣는다.

튜플에선 불가 키에 해당하는 데이터는 다음과 같이 넣을 수 있다.

사전명["키"]=데이터

자료수정 해당 데이터 위치에 데이터를 대입하면 된다.

리스트명[3]=데이터 형태로 명령하면 4번째 데이터가 수정된다.

튜플에선 불가 해당하는 키에 대입하면 수정된다.

사전명["키"]=데이터

자료삭제 인덱스를 사용하느냐, 값을 사용하느냐에 따라 두 가지로 나눈다.
방법 설명
del 리스트명[인덱스] 해당하는 데이터를 지운다.
리스트명.remove(데이터) 데이터에 해당하는 값을 지운다.
튜플에선 불가
방법 설명
del 사전명[인덱스] 해당하는 데이터를 지운다.
구조변경 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)에서 좌우의 데이터 갯수가 다른데, 이럴 때 발생한다. 이 경우엔 데이터 하나에 여러 변수를 대응시킬 때!