부스트코스 파이썬(PY4E) 코칭스터디 1기 - 6주차 학습

<world />·2021년 8월 19일
0

부스트코스

목록 보기
7/7
post-thumbnail

📖딕셔너리 개념 및 특징


들어가며

지금까지는 리스트라는 컬렉션만 배웠었는데, 오늘은 파이썬의 강력한 컬렉션인 딕셔너리에 대해 배워도록 하자. 먼저 딕셔너리의 개념과 특징에 대해 살펴보고, 딕셔너리를 생성하는 방법과 딕셔너리에 저장된 값에 접근하는 방법을 배워 보도록 하자.

학습 목표

딕셔너리의 개념과 특징을 이해하고 딕셔너리를 생성하여 값에 접근할 수 있다.

핵심 키워드

  • 컬렉션
  • 딕셔너리
  • 연관 배열




학습 내용


컬렉션(Collection)

리스트나 딕셔너리 같은 변수를 가지는 상황이며 하나의 정보보다는 여러 개의 정보를 저장할 때 사용된다.

리스트(List)

리스트는 순서대로 정리된 컬렉션이다. 데이터를 추가하면 항상 리스트의 끝에 추가되고 0부터 n-1번 위치까지 순서대로 n개의 원소가 저장되어 있다.

딕셔너리(Dictionary)

리스트와 달리 딕셔너리에는 순서라는 것이 없다.
대신 키(Key)라는 것이 존재한다. 마치 물건에 포스트잇으로 라벨을 붙이는 것과 비슷하다. 딕셔너리는 다음과 같이 dict()라는 생성자를 통해 생성할 수 있다. 그리고 다음과 같이 생성할 수 있다.

purse = dict() # 또는 purse = {} 와 같이 생성할 수도 있다.
purse['money'] = 12 # 'money'라는 키에 12라는 값 연결
purse['candy'] = 3  # 'candy'라는 키에 3이라는 값 연결
purse['tissues'] = 75 # 'tissues'라는 키에 75라는 값 연결

이때 purse를 실행해보면 다음과 같은 형태로 출력이 된다. 여기서는 입력한 순서대로 나오지만 항상 입력한 순서대로 출력되는 것은 아니다.

print(purse)
#{'money': 12, 'candy': 3, 'tissues': 75}

여기에서 candy라는 키에 저장된 값에 접근하려면 다음과 같이 대괄호 안에 키를 넣어서 접근할 수 있으며

print(purse['candy'])
#3

접근한 내용을 업데이트할 수도 있다.

purse['candy']  = purse['candy'] + 2
print(purse)
#{'money': 12, 'candy': 5, 'tissues': 75}

연관 배열(Associative Arrays)

이렇게 키와 값이 연결되는 개념을 보통 연관 배열이라고 한다. 접근하는 방식이 리스트와 비슷하지만 키를 갖고 접근한다는 차이점이 있다. 여기에서 연관이 의미하는 것은 키와 값 사이의 연결 관계이다. 리스트에는 위치와 값 사이에 연결 관계가 있었다. 그러나 위치와의 연결 관계는 비교적 덜 강력하고 덜 유연하다. 그래서 대부분의 현대 프로그래밍 언어에는 연관 배열이라는 개념이 있다.

연관 배열의 다양한 이름

  • property maps : Perl / PHP
  • hash maps : Java
  • property bags : C# / .Net





📖튜플 개념 및 특징


들어가며

파이썬의 강력한 컬렉션인 딕셔너리에 대해 배웠는데, 리스트와 비슷하지만 또 다른 특성을 갖고 있는 튜플에 대해 알아보자. 먼저 튜플과 비슷한 리스트와의 공통점과 차이점에 대해 알아보고, 튜플의 특성을 어떤 상황에서 활용할 수 있는지 간단히 살펴보자.

학습 목표

튜플과 리스트의 차이를 이해하고, 튜플의 특성을 활용해 문제를 해결할 수 있다.

핵심 키워드

  • 튜플(tuple)
  • immutable




학습 내용


리스트(List)와 비슷한 컬렉션, 튜플(Tuple)

튜플은 리스트와 굉장히 비슷하다.
다음 코드를 보면 리스트와의 차이는 단지 대괄호 대신 소괄호를 사용했다는 정도라는 것을 알 수 있다. 리스트와 같이 순서가 있어서 인덱스로 접근이 가능하고, 최대값도 찾을 수 있다.

x = ('Glenn', 'Sally', 'Joseph')
print(x[2])
# Joseph
y = ( 1, 9, 2 )
print(y)
# (1, 9, 2)
print(max(y))
# 9

뿐만 아니라, for 반복문에서 반복을 시키면 리스트와 같이 원소를 순서대로 출력해준다.

for iter in y :
    print(iter)
# 1
# 9
# 2

변경 불가능한 속성(immutable)

하지만 리스트와 큰 차이가 있는데, 그것은 변경불가능(immutable), 즉 값을 변경할 수 없다는 특성이다. 예를 들면, 리스트에서는 다음과 같이 원소의 값을 변경할 수 있다.

x = [9, 8, 7]
x[2] = 6
print(x)
# [9, 8, 6]

하지만 다음과 같이 튜플일 경우에는 오류가 발생한다. 그 이유는 바로 변경 불가능한 속성 때문이다.

x = (9, 8, 7)
x[2] = 6
print(x)

# ---------------------------------------------------------------------------
# TypeError                                 Traceback (most recent call last)
# <ipython-input-4-6136e7d6cb90> in <module>()
#       1 x = (9, 8, 7)
# ----> 2 x[2] = 6
#       3 print(x)
# 
# TypeError: 'tuple' object does not support item assignment

이런 변경 불가능한 속성 때문에 튜플은 리스트보다 훨씬 더 효율적으로 동작한다. 용량도 적게 차지하고, 접근도 훨씬 빠르다. 물론, 이런 특성으로 인해 리스트에서 할 수 있는 일을 하지 못하는 경우도 있다. 다음 코드를 보면, 한 번 생성된 튜플은 정렬하거나, 값을 추가하거나, 순서를 바꿀 수 없다.

x = (3, 2, 1)
x.sort()
# Traceback:
# AttributeError: 'tuple' object has no attribute 'sort'
x.append(5)
# Traceback:
# AttributeError: 'tuple' object has no attribute 'append'
x.reverse()
# Traceback:
# AttributeError: 'tuple' object has no attribute 'reverse'

이외에도 리스트에서 할 수 있는 것 중 값을 변경하는 것들은 튜플에서 할 수 없다. 구체적으로 리스트에 내장된 함수와 튜플에 내장된 함수를 비교하면 다음과 같다.

 l = list()
 dir(l)
# ['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

 t = tuple()
 dir(t)
# ['count', 'index']

즉, 값을 변경하지 않아도 되는 count, index와 같은 함수만 작동하는 것이다.


튜플의 장점

임시 변수로 활용

변경이 되지 않는 속성으로 인해 튜플은 파이썬에서 더 효율적으로 동작된다. 하지만 이런 특성은 입문하는 사람들에겐 큰 장점이 아닐 수도 있다. 그러면 튜플은 언제 사용하면 좋을까? 튜플을 다음과 같이 좌변에 사용하면 간단하게 여러 변수에 값을 넣을 수 있다. 단, 이럴 경우 좌변과 우변의 개수는 일치해야한다.

(x, y) = (4, 'fred')
print(y)
# fred
(a, b) = (99, 98)
print(a)
# 99

이와 같은 특성을 잘 활용하면 함수에서 여러 개의 값을 한꺼번에 반환할 수도 있다.

def t() :
    return (10, 20)
x, y = t()
print(x, y)

# 10 20

한가지 팁은, 소괄호를 사용하지 않아도 컴마로 여러 값을 나열하면 파이썬에서는 튜플로 인식하기 때문에 다음과 같이 간단히 사용할 수도 있다.

x, y = 1, 10
print(x, y)
# 1 10

x, y = y, x
print(x, y)
# 10 1

딕셔너리를 처리하는데 활용

딕셔너리의 items 메소드는 딕셔너리에 저장된 각 키와 값의 한 쌍을 튜플로 이루어진 리스트 형태로 만들어준다. 따라서 다음과 같이 사용할 수도 있다.

d = dict()
d['csev'] = 2
d['cwen'] = 4
for (k,v) in d.items(): 
    print(k, v)
# csev 2
# cwen 4

tups = d.items()
print(tups)
# dict_items([('csev', 2), ('cwen', 4)])

여러 값에 대해 비교 가능

튜플의 또 다른 장점은 여러 값에 대해 비교가 가능하다는 점이다.
비교의 방법은 각 튜플의 가장 왼쪽 값끼리 비교한 후 둘의 값이 다를 경우에는 나머지 값들을 비교하지 않고 큰지, 작은지 여부를 판단한다. 만약 가장 왼쪽 값이 동일할 경우에는 그 다음 값을 비교하고, 그 값도 같으면 또 다음 값을 비교하는 형태로 비교가 진행된다.

 (0, 1, 2) < (5, 1, 2)
# True 값을 가진다.
 (0, 1, 2000000) < (0, 3, 4)
# True 값을 가진다.
 ( 'Jones', 'Sally' ) < ('Jones', 'Sam')
# True 값을 가진다.
 ( 'Jones', 'Sally') > ('Adams', 'Sam')
# True 값을 가진다.





💬

Reference


6주간의 부스트코스 파이썬 코칭스터디! 마지막 6주차 학습 끝!

0개의 댓글