[2부 5장] 리스트, 딕셔너리

soyeon·2022년 6월 29일
0

리스트

  • 순서대로 값을 저장한다.
  • 번경 가능하고, 입력 순서가 유지된다.
  • 내부적으로는 동적 배열로 구현되어 있다.
  • 스택과 큐에서 사용할 수 있는 연산들을 모두 제공한다.

리스트의 주요 연산

연산시간 복잡도설명
len(a)O(1)전체 요소의 개수를 리턴한다.
a[i]O(1)인덱스 i의 요소를 가져온다.
a[i:j]O(k)인덱스 i부터 j-1까지 k개의 요소를 가져온다.
elem in aO(n)elem 요소가 존재하는지 확인한다.
a.count(elem)O(n)elem 요소의 개수를 리턴한다.
a.index(elem)O(n)elem 요소의 위치(인덱스)를 리턴한다.
a.append(elem)O(1)리스트의 마지막 부분에 elem을 추가한다.
a.pop()O(1)리스트의 마지막 요소를 추출한다.(스택 연산)
a.pop(0)O(n)리스트의 첫번째 요소를 추출한다.(큐 연산)
del a[i]O(n)리스트의 i 인덱스 요소를 삭제한다.
a.sort()O(n log n)리스트를 정렬한다.
min(a), max(a)O(n)최솟값/최대값을 계산한다.
a.reverse()O(n)리스트를 뒤집는다.

리스트 활용 방법

리스트 선언

# 방법 1
a = list()

# 방법 2
a = []

요소 추가

파이썬 list에는 숫자 뿐만 아니라 다른 자료형도 추가할 수 있다.
ex) 문자열, 불리언

  • append
    : 리스트의 끝에 요소를 추가한다.
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a

[1, 2, 3, 4]
  • insert
    : 특정 인덱스에 요소를 추가한다.
    insert(i,item) - i 인덱스에 item을 추가한다.
>>> a = [1, 2, 4]
>>> a.insert(2,3)
>>> a

[1, 2, 3, 4]

슬라이싱

슬라이싱 기능으로 원하는 범위 안의 요소들을 가져올 수 있다.

  • 예시1
    : a[i:j] - i 인덱스부터 j-1 인덱스까지의 요소를 가져온다.
>>> a = [1, 2, 3, 4]
>>> a[1:3]

[2, 3]
  • 예시2
    : a[:j] - 첫번째 인덱스부터 j-1 인덱스까지의 요소를 가져온다.
>>> a = [1, 2, 3, 4]
>>> a[:3]

[1, 2, 3]
  • 예시3
    : a[i:] - i 인덱스부터 마지막 인덱스까지의 요소를 가져온다.
>>> a = [1, 2, 3, 4]
>>> a[1:]

[2, 3, 4]
  • 예시4
    : a[i:j:k] - i 인덱스부터 j-i 인덱스까지 가져오는데 k칸씩 건너가면서 인덱스가 커진다.
>>> a = [1, 2, 3, 4]
>>> a[1:4:2]

[2, 4]

요소 삭제

  • 인덱스로 삭제하기
    : del a[i] - i 인덱스 값을 삭제한다.
>>> a = [1, 2, 3, 4, 5]
>>> del a[2]
>>> a

[1, 2, 4, 5]
  • 값으로 삭제하기
    : a.remove(item) - item 값을 가진 요소를 삭제한다.
>>> a = [1, 2, 3, 4, 5]
>>> a.remove(4)
>>> a

[1, 2, 3, 5]
  • pop 함수로 삭제
    : a.pop(i) - i 인덱스 값을 리턴하고 삭제한다.
>>> a = [1, 2, 3, 4, 5]
>>> a.pop(2)
3
>>> a
[1, 2, 4, 5]

리스트 특징

  • 연속된 공간에 요소를 배치하는 배열의 특징과 다양한 타입들을 연결해 배치하는 연결 리스트의 특징을 모두 가지고 있다.
  • 여러 자료형을 저장할 수 있어 편리하지만 속도 면에서는 불리하다.

딕셔너리

  • 키와 값 구조로 이루어져 있다.
  • 입력 순서가 유지된다.
    : 3.7 버전부터 개선된 것으로, 이전 버전에서는 입력 순서가 유지되지 않는다.
  • 내부적으로는 해시 테이블로 구현되어 있다.
  • 불변 객체는 모두 키로 사용될 수 있다.

딕셔너리 주요 연산

연산시간 복잡도설명
len(a)O(1)전체 요소의 개수를 리턴한다.
a[key]O(1)키를 조회해서 값을 리턴한다.
a[key] = valueO(1)키/값을 삽입한다.
key in aO(1)딕셔너리에 해당 키가 존재하는지 확인한다.

딕셔너리 활용 방법

딕셔너리 선언

# 방법 1
a = dict()

# 방법 2
a = {}

키/값 추가

a = {'key1' : 'value1', 'key2' : 'value2'}
a['key3'] = 'value3'

값 조회

  • 키 값으로 조회
    : a[key] - 찾으려는 key의 값을 가져온다.
    존재하지 않는 키를 조회하면 에러가 발생한다.
>>> a = {'key1' : 'value1', 'key2' : 'value2', 'key3' : 'value3'}
>>> a['key2']

value2
  • for문으로 조회
a = {'key1' : 'value1', 'key2' : 'value2', 'key3' : 'value3'}

for k,v in a.items():
	print(k,v)

key1 value1
key2 value2
key3 value3

예외 처리

존재하지 않는 key의 값을 조회하려고 하면 에러가 발생한다. 이에 대한 예외 처리를 하면 유용하다.

  • try
a = {'key1' : 'value1', 'key2' : 'value2', 'key3' : 'value3'}

try:
	print(a['key4'])
except:
	print('존재하지 않는 키입니다.')
  • in
a = {'key1' : 'value1', 'key2' : 'value2', 'key3' : 'value3'}

if 'key4' in a:
	print(a['key4'])
else:
	print("존재하지 않는 키입니다.")

딕셔너리 모듈

defaultdict 객체

: 존재하지 않는 키 값을 조회하는 경우, 에러를 출력하는 대신에 설정한 디폴트 값으로 딕셔너리 아이템을 생성한다.
int의 경우는 0이 디폴트 값이다.
list의 경우는 빈 리스트가 만들어진다. 값을 지정하면 해당값으로 초기화된다.

>>> a = collections.defaultdict(int)  # 원하는 자료형으로 생성한다.
>>> a['A'] = 5
>>> a['B'] = 4
>>> a['C'] += 1
>>> a

defaultdict(<class 'int'>, {'A': 5, 'B': 4, 'C': 1})

Counter 객체

: 아이템의 개수를 딕셔너리 형태로 변환하여 리턴한다.
키에는 아이템의 값, 값에는 아이템의 개수가 저장된다.

>>> a = [1,2,3,4,5,5,5,6,6]
>>> b = collections.Counter(a)
>>> b

Counter({5: 3, 6: 2, 1: 1, 2: 1, 3: 1, 4: 1})
  • Counter 객체에서 빈도 수가 가장 높은 요소 찾아내기
>>> b.most_common(2)  # 빈도가 높은 2개 요소 출력

[(5, 3), (6, 2)]

OrderedDict 객체

: 입력한 순서 그대로 순서가 유지된다.

>>> collections.OrderedDict({'key1' : 'value1', 
							'key2' : 'value2', 'key3' : 'value3'}))
 
OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])

파이썬 3.7부터는 내부적으로 인덱스를 이용해 입력 순서가 유지되어 해당 객체는 더이상 사용할 필요는 없다.

<파이썬 타입 선언>

  • 이름으로 선언
>>> a = list()
>>> type(a)
<class 'list'>
  • 기호로 선언
>>> type([])
<class 'list'>
>>> type(())
<class 'tuple'>
>>> type({})
<class 'dict'>
>>> type({1})
<class 'set'>

0개의 댓글