python의 내장 자료구조

알고리즘 문제풀이를 시작하기 전, python에 내장되어있는 자료구조를 알아본다.

Posted by Seoyoung Lee on May 05, 2020 · 9 mins read

python에 내장된 자료구조 중, 가장 많이 사용하는 list, tuple, set, dict에 대해 알아본다.


1. List

가장 많이 쓰는 자료구조이다. list를 생성할 때에는, '[]'를 사용하거나 list()를 사용한다.

l = [1, 2, 3, 4, 5]
l = list(range(1, 6))
l = list(reversed(range(1, 6)))   #[5, 4, 3, 2, 1]

list 끼리의 '+'는 list의 값을 더하는 것이 아닌 두개의 list를 접합해 새로운 list를 만든다. 또한, 'x'는 list를 곱한 수만큼 반복해 새로운 list를 반환한다.

[1, 2, 3] + [4, 5, 6]   #[1, 2, 3, 4, 5, 6]

l = [0] * 5             #[0, 0, 0, 0, 0]
m = [1, 2, 3] * 3       #[1, 2, 3, 1, 2, 3, 1, 2, 3]

list의 slicing 또한 가능하다.

l = list(range(1, 6))   #[1, 2, 3, 4, 5]
l[2:4]                  #[3, 4]
List 자료형의 Method
l = [1, 2, 3]

#list.append() : 따로 반환하는 값 없음
l.append(4)     #[1, 2, 3 ,4]

#list.pop() : 해당 list의 맨 뒤의 값을 빼내서 반환(4)
l.pop()         #[1, 2, 3]

#list.sort() : list 안의 원소들을 정렬
l.sort()                #오름차순 정렬
l.sort(reverse=True)    #내림차순 정렬

그 밖에 아래와 같은 method들이 있다.

- count(원소) : 리스트 내 특정 원소가 몇 개 포함되어 있는지 반환
- index(원소) : 리스트 내 특정 원소의 인덱스를 반환
- extend(리스트) : 리스트의 뒤 쪽에 다른 리스트를 삽입
- insert(인덱스, 원소) : 특정한 위치에 원소를 삽입
- remove(원소) : 리스트 내 특정 원소를 삭제
- del : 리스트의 특정 원소를 제거
- reverse() : 리스트를 뒤집기
- sum(리스트 자료형) : 리스트의 모든 원소의 합
- all() / any() : 리스트의 모든 원소가 참인지/하나라도 참인지 판별
- enumerate() : 리스트에서 인덱스와 원소를 함께 추출


2. Tuple

tuple를 생성할 때에는, '()'를 사용하거나 tuple()를 사용한다.

t = (1, 2, 3, 4, 5)
t = tuple(range(1, 6))
t = tuple(reversed(range(1, 6)))   #(5, 4, 3, 2, 1)

'+', '*' 를 사용할 때에도 list와 똑같다.

tuple은 list와 공통점이 정말 많지만 list와 달리 한 번 생성된 값을 변형할 수 없다.

그러므로 tuple은 append, sort, pop 등의 메소드는 사용할 수 없다.

Tuple 자료형의 Method
t = (1, 2, 3, 4, 5, 1, 2, 1, 2)

#count() : tuple내에 받은 값이 몇개 있는지 세는 함수, list도 사용가능
print(t.count(1))       #3
print(t.count(3))       #1


3. Set

set를 생성할 때에는, '{}'를 사용하거나 set()를 사용한다.

a = {1, 2, 3, 'a'}
a = set(range(1, 6))

set는 list와 tuple과 달리 원소간 순서가 없다. 그러므로 indexing이 불가능하다.

또한 set는 원소의 중복을 허용하지 않는다. (unique) 만약 원소가 두개 이상 중복되면 한 개만 남게된다.

print({1, 1, 1, 1, 1, 1, 1, 1, 1})      #{1}
Set 자료형의 Method
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}

# set.intersection() : 교집합, '&' 연산자를 통해서도 실행가능
print(a.intersection(b))    #{4, 5}
print(a & b)                #{4, 5}

# set.union() : 합집합, '|' 연산자를 통해서도 실행가능
print(a.union(b))           #{1, 2, 3, 4, 5, 6, 7, 8}
print(a | b)                #{1, 2, 3, 4, 5, 6, 7, 8}

# set.difference() : 차집합, '-' 연산자를 통해서도 실행가능
print(a.difference(b))      #{1, 2, 3}
print(a - b)                #{1, 2, 3}


4. Dictionary

dict는 단순히 값 자체를 저장하기 보다는 키와 값 쌍을 저장한다.

dict를 생성할 때에는, set와 같이 '{}'를 사용한다.

d = {'a': 1, 'b': 2, 'c': 3}

key값을 통해 value에 접근할 수 있다. indexing과 비슷하며 문법도 동일하게 '[]'를 사용한다.

d = {'a': 1, 'b': 2, 'c': 3}

print(d['a'])       #1
print(d['b'])       #2

d['d'] = 4
d['e'] = 1000000000 #{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 1000000000}

dict에서는 value는 중복이 가능하지만, key는 중복이 불가능하다.

for문을 사용하여 dict의 값을 받아올 때, key, value, key-value쌍 모두 받아올 수 있다.

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

for k in d:
    print(k)

for v in d.values():
    print(v)

for k, v in d.items():
    print(k, ' : ', v)

sorted()로 정렬을 할 때, key, value, key-value쌍 모두 기준이 될 수 있다. 또한 sorted()는 list를 반환한다.

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

sorted(d.items())                       #키로 정렬하기
sorted(d.items(), reverse=True)         #키로 내림차순 정렬
sorted(d.items(), key=lambda x:x[1])    #값으로 정렬하기
Dict 자료형의 Method

호출하는 key가 없으면 대신 기본값을 반환하는 코드를 짜고 싶을 때 get()메소드를 사용한다.

d = {'a': 1, 'b': 2, 'c': 3}

# 1. key가 있을 때
print(d.get('a', 0))            #1
print(d.get('b', 0))            #2
# 2. key가 없을 때
print(d.get('aaaaaaaaaa', 0))   #0
print(d.get('z', 100))          #100