python에는 여러 가지의 자료 구조가 있다. 
그래서 코드를 짤때 자료 구조의 특성을 잘 이해하고 활용하는 게 중요하다. 필자는 자료구조들 중
List, Set, Tuple, Dictionary를 설명하고자 한다. 

1) List

list의 특징은 순서를 가지고 있으며 수정이 가능하다는 것이다. 가장 기본적이 자료 구조이다.

- List 생성하기

list는 대괄호를 이용해 [value1, value2... value n] 형태로 만든다.

- List indexing

List는 순서가 있는 자료형이기 때문에 index를 이용해 원하는 정보만 얻을 수 있다.

- List 연산

덧셈과 곱셈을 List에 적용할 수 있다.

- List 수정

List는 수정이 가능한 자료형이다.

- List 자르기

List의 index를 이용하여 자르기가 가능하다 형태는  list [n1, n2]이며 n1이상 n2미만의 index에 할당된 값을 반환한다.

위와 같이 숫자를 넣지 않으면 n1, n2에 시작과 끝 값이 주어짐을 알 수 있다.

만약 역순으로 나열하고 싶다면 list [n1:n2:-1]같이 끝에 -1을 붙이면 된다.

- List 안에 List

List는 원소로 list 타입의 값도 받을 수 있다.

- List에 적용 가능한 함수들

1. len(list): list의 길이를 반환해준다
2. max(list): list원소들 중에서 가장 큰값을 반환해준다.
3. min(list): list원소들 중에서 가장 작은 값을 반환해준다.
4. sum(list): list원소들의 합을 반환해준다.
5. sorted(list): list의 원소를 오름차순으로 정리해준다.단list에적용되는 것은 아니다.

sorted(num)을 했지만 다시 num을 출력해보니 정렬이 되지 않은 상태이다.

이를 해결하기 위해서는 아래와 같이 하면 된다.

list의 원소들이 string타입이라면 알파벳 순으로 값이 크다 작다를 판단하는 모습이다.

sum()은 실행되지 않는다.

당연한 얘기지만 list의 원소 타입이 다를 경우 비교를 할 수 없으므로 함수 실행 시 에러가 뜬다.

추가로 list에 in operator를 쓸 수 있다.

- List의 함수

1. list.append(v): list에 value를 추가 해준다.
2. list.clear(): list의 모든 원소들을 삭제한다. 
3. list.count(v): list에 있는 모든 value값들의 수를 반환한다.
4. list.extend(v): list에 value값에 있는 원소들을 추가한다.
5. list.index(v): list의 원소들중에 value v가 있다면 list에 존재하는 v의 index를 반환한다. 이때 가장 앞에 있는 index만 반환한다.
6. list.index(v,beg): list.index(v)와 달리 index beg 부터 시작해 가장 앞에 있는 index를 반환한다.
7. list.index(v,beg,end): index beg 와 index end-1 사이에 있고 가장 앞에 있는 index를 반환한다
8. list.insert(i,v): value v를 list[i]에 삽입한다.이때 수정하는 것과는 다르다
9. list.pop(v): list에서 맨끝에 있는 값을 반환하고 list에서 반환한 원소를 지운다.
10. list.remove(v): list에 맨앞에 있는 value v를 지운다
11. list.reverse(): list의 원소들을 반대로 다시 정렬한다.
12. list.sort(): list의 원소들을 오름차순으로 정렬한다.이때 string의 경우 알파벳 순으로 정렬한다.
13. list.sort(reverse=True): sort()와 반대로 내림차순으로 정렬한다

* 함수 사용 시 주의 사항

아래와 같이 list num에 sort() 함수를 사용해 새로운 list를 만들어 num2_sort에 할당한다고 해보자

왜 num2_sort는 None 값이 나올까?
그 이유는 sort() 함수는 retrun 값이 없고 그냥 list에만 영향을 주는 함수이기 때문이다. 오직 retrun 값이 있는 함수만이 None값이 나오지 않는다. 주의해서 이런 실수를 하지 않도록 하자.
num은 기본값을 유지하고 정렬된 값을 num2_sort에 할당하는 방법이 있을까?
물론 방법이 있다. 그 방법은 다음 챕터인 List Aliasing에서 다뤄보겠다

- List aliasing

list에는 C언어의 참조자와 비슷한 기능이 있다.

- int 형태일 때와 다르게 list 형태면 num 값이 바뀌면 num2값도 같이 바뀌는 모습을 볼 수 있다.
- 그러므로 int형태 일때와 다르게 list형태일 때 다른 변수와 똑같다고 선언할 때 주의를 해야 한다.
- 그렇다면 num값의 기본값을 유지하면서 num값의 원소들을 변경하고 싶으면 어떻게 해야 할까?

추가로 list()를 활용해서 해결할 수 도 있다.

2) Set

set 자료구조의 특징은 순서는 없지만 수정은 가능하다는 것이다.
가장 큰 set의 특징은 중복된 원소 값을 가지지 않는 것이다.

- Set 생성하기

set은 대괄호를 이용해 {value1,value2...value n)형태로 만든다.

- 위에 코드를 보면 원소400을 2개 주었지만 tuple num을 출력 하면 1개의 400만 있다.(중복안됨)
- 입력값과 출력값의 원소들의 순서를 보면 tuple은 순서가 없는(unordered) 자료구조임을 알 수 있다.

index가 없으므로 Error가 나는 모습

set을 만들때는 또한 set()함수를 이용해서 만들수있는데 조건이 있다.
- set(v) 라 한다면 v에는 값을 주지 않거나 하나의 변수이면서 list,set,str 같은 자료구조여야 한다.
- range(n)도 실행가능하다. 
- 단순히 int 숫자만 있으면 실행이 되지 않는다.

- Set의 함수들

사실 위에 있는 함수들중 몇개는 사칙연산,논리연산을 통해 표현할수 있다.

1. set1.difference(other): set1 - other 
2. set1.intersection(other): set1 & other
3. set1.issubset(other): set1 <= other
4. set1.issuperset(other): set1 >= other
5. set1.symmetric_difference(other): set1 ^ other
6. set1.union(other): set1 | other

아래 코드는 사용 예시이다.

- 함수를 쓴 코드와 연산자를 쓴 코드와 값이 똑같음을 알 수 있다.
- 마지막으로 Set형태의 자료 구조는 중복된 값을 포함하지 않는 집합이라고 보면 된다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기