[NIPA 온라인 교육] 핵심 파이썬 기초(4)

minseung Shin·2021년 7월 27일
0

NIPA 온라인 교육

목록 보기
5/5

'꾸준히 하자'라는 말을 되새기자.

강의는 열심히 듣고 있는데, 막상 복습을 하면서 벨로그에 작성하는 일은 쉽지만은 않은 것 같다..
벌써 첫번째 트랙의 모든 강의를 수강하고 교육을 이수하게 되었다 ! 하지만, 4번째, 5번째 강의에 대한 복습한 내용을 작성해야 하기에 다시 공부한다는 마음으로 글을 쓰고자 한다.
오늘의 강의는 4번째 강의로, "파이썬에서 자료를 담는 여러가지 방식" 이라는 강의이다.

파이썬에서 자료를 담는 여러가지 방식

리스트 활용

리스트를 활용하는 방식에는 여러가지가 있지만, 그 중 "인덱싱", "슬라이싱"에 대해 학습을 했었다. (한번 더 살펴보자 !)

먼저, 인덱싱이란, 리스트의 위치를 사용하여 값에 접근하는 방법으로, 시퀀스의 한 원소를 가져오는 것을 의미하기도 한다. 예시로 살펴보면 다음과 같다.

# num 리스트에 있는 0번째, 1번째 위치에 있는 원소를 가져오기
num = [2, 5, 7, 8, 9, 11]
print(num[0], num[1])

# 2, 5

다음으로, 슬라이싱이다. '슬라이싱'이란, '자르다, 나누다'라는 것을 의미하며 리스트 슬라이싱은 여러 위치에 있는 값을 한번에 잘라서 사용하는 것을 뜻한다. 다시 말해, 시퀀스의 일부분을 가져오는 것이라고 보면 된다.

# 0번 위치부터 4번 위치까지 값을 출력 
num = [2, 5, 8, 7, 9, 10, 13, ['Hello', 'Python', 'Good'] # 리스트 안에 중첩해서 리스트를 넣을 수 있다고 한다. 
print(num[0:4])

# [2, 5, 8, 7]

# 리스트 슬라이싱은 중첩된 리스트에서도 슬라이싱하여 값을 사용할 수 있다.
num = [2, 5, 8, 7, 9, 10, 13, ['Hello', 'Python', 'Good']
print(num[7][0:2])

# ['Hello', 'Python']

지난 시간에 배웠던 리스트 활용에 대해 잠깐 살펴보았다. 굉장히 단순한 예제로 돌이켜봤지만, 리스트 활용은 무궁무진하다고 생각한다.

1. list.append(d)

'Dot Access', 리스트라는 자료형에서 어떠한 함수를 사용할 때 'dot access'를 이용한다고 한다.
list.append(d)자료 d를 리스트 마지막 원소 뒤에 추가하는 것이며, 이때 추가할 수 있는 것은 오직 한 개의 자료만 넣을 수 있다.

a = []
b = ['a', 'b', 'c']
a.append(10) # a 리스트에 10을 추가해라
b.append('d') # b 리스트에 'd'를 추가해라
print(a, b)

# [10] ['a', 'b', 'c', 'd']

그런데, 내가 자료를 추가할 때마다 꼭 맨 뒤에만 넣을까? 맨 처음에 자료를 넣고 싶거나 중간에 자료를 추가하고 싶을 때는 어떻게 해야하지?
이때 사용할 수 있는 것이 있다.

바로 'list.insert(i, d)'이다.

2. list.insert(i, d)

인덱스 i에 자료 d를 추가하는 것으로, 이때 역시 오직 한 개의 자료만 넣을 수 있다.
이때 필요한 것은 2가지이다. '어디에?(위치, i)', 그리고 '무엇을?(자료, d)'이다.

c = [1, 2, 4, 5]
c.insert(2, 3) # i는 삽입할 위치, d는 자료
print(c)

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

c 리스트의 2번째 위치에 3이라는 자료를 넣는 것이기 때문에, 2와 4 사이에 3의 값이 들어가게 된다.

자, 리스트를 추가하는 것을 했다면? 반대로 삭제도 가능해야 할 것이다. 그렇다면 리스트 안에 있는 원소를 삭제하고 싶을 땐 어떻게 해야할까...

list.remove(d)를 사용해보자.

3. list.remove(d)

특정 리스트에서 remove라는 함수를 사용할 때 가장 중요한 것은 '어떤 자료를 삭제할 것인가?'이다. 따라서, 'd'에 들어갈 것은 삭제하고 싶은 자료이다.
하지만, 여기서 중요한 것이 있다. 삭제하고 싶은 자료가 있는데, 리스트 내에서 중복되는 자료라면 어떻게 될까?
list.remove(d)처음 나오는 자료 d를 제거한다. (예시를 통해 보면 쉽게 이해할 수 있다.)

d = [3, 1, 2, 3]
d.remove(3) # d 리스트 안에 있는 3이라는 자료를 삭제 ! 
print(d)

# [1, 2, 3]

예시를 통해서도 볼 수 있듯이, '3'이라는 자료는 0번째와 3번째에 존재하지만, 그 중 먼저 나온 0번째의 자료 '3'이 삭제된 것을 알 수 있다. 이렇게 remove를 통해 자료를 삭제하는 경우에 중복 시 인덱스가 작은 원소를 제거하게 된다.

4. list.sort()

때로는 리스트를 정렬해야 할 경우가 있다. 이때 사용되는 것이 'list.sort()'이다. (이 경우에는 괄호 안에 특별한 내용을 넣지 않는다.)
list.sort()는 리스트를 정렬해주는 역할을 하며, 자료형에 따라 숫자형인 경우에는 오름차순, 문자형인 경우에는 사전순으로 정렬한다.

e = [6, 2, 4, 1]
f = ['carrot', 'apple', 'banana']
e.sort()
f.sort()
print(e, f)

# [1, 2, 4, 6] ['apple', 'banana', 'carrot']

list.sort()를 사용할 때는 주의할 점이 있다. 바로, 해당 리스트가 같은 자료형으로 이뤄져야한다는 것이다. (리스트 내부에 다른 자료형이 있으면, 사용할 수 없다.)

리스트 정렬에 대해 좀 더 알아보자 !

단순히 오름차순 정렬만 있는 것이 아닐테고, list.sort()만으로 리스트를 정렬하지는 않을 것이다. 파이썬 리스트 정렬에 대해 좀 더 알아보았더니 여러 방법이 있었다. (역시 구글링은 좋다.)

  • reverse: 리스트를 거꾸로 뒤집는다. (내림차순 정렬은 아니다.)
a = [1, 10, 5, 7, 6]
a.reverse()
print(a)

# [6, 7, 5, 10, 1]
  • sort: 정렬, 기본값은 오름차순 정렬이며, reverse옵션이 True일 경우, 내림차순 정렬을 한다.
a = [1, 10, 5, 7, 6]
a.sort()
print(a)

# [1, 5, 6, 7, 10]

a = [1, 10, 5, 7, 6]
a.sort(reverse=True)
print(a)

# [10, 7, 6, 5, 1]
  • sort의 key 옵션: key 옵션에 지정된 함수의 결과에 따라 정렬, 아래의 예시는 원소의 길이를 통해 정렬한 것이다.
wish = '나는 파이썬을 잘하고 싶다'
wish = wish.split() # wish 리스트를 분할
print(wish)

# ['나는', '파이썬을', '잘하고', '싶다']

wish.sort(key=len)
print(wish)

# ['나는', '싶다', '잘하고', '파이썬을']

역시나 많은 방법이 존재했다... 전부 기억하지는 못하겠지만, 적어도 구조에 대해서는 기억하는 게 좋을 것 같다 !

시퀀스 자료형

시퀀스 자료형이란

기존에 배운 자료형에는 숫자형, 문자열, 리스트, 그리고 논리형이 존재하는데, 시퀀스 자료형은 '문자열'과 '리스트' 자료형을 의미하며, 이 두 자료형은 공통점이 있는데, 바로 순서가 존재한다는 것이다.
다시 말해, '시퀀스 자료형'순서가 있는 자료형으로, 리스트, 문자열 등이 이에 속한다.

a = "Once" # 문자열
b = ['T', 'W', 'I', 'C', 'E'] # 리스트
c = (1, 2, 3, 4, 5) # 튜플

시퀀스의 특징

첫번째, 원소 사이에 순서가 존재하며, 인덱싱/슬라이싱이 가능하다.

a = "Once"
b = ['T', 'W', 'I', 'C', 'E']
print(a[1]) # n
print(b[2:4]) # ['I', 'c'] 

인덱싱/슬라이싱을 할 때 음수를 넣거나, 자리를 비우는 것도 가능하다.

a = "Once"
b = ['T', 'W', 'I', 'C', 'E']
print(a[-1]) # e | 뒤에서 1번째 원소
print(b[:3]) # ['T', 'W', 'I'] | 처음 ~ 3번째 슬라이싱

두번째, 멤버(원소) 조회가 가능하다. in 연산자로 시퀀스 안에 원소가 있는지 확인이 가능하다.

원소 in 시퀀스: 있으면 True, 없으면 False

a = "Once"
b = ['T', 'W', 'I', 'C', 'E']
print('O' in a) # True | 문자열 'O'가 문자열 a에 있니? 
print('B' in b) # False | 문자열 'B'가 리스트 b에 있니?

세번째, 길이 확인이 가능하다. len 연산자로 시퀀스 안에 원소가 몇 개인지 확인할 수 있다.

a = "Once"
b = ['T', 'W', 'I', 'C', 'E']
print(len(a)) # 4
print(len(b)) # 5

네번째, 리스트끼리 연결 연산을 할 수 있다. + 연산자로 같은 시퀀스 두개를 이어 붙일 수 있다.

c = ['t', 'w', 'i'] + ['c', 'e']
print(c) # ['t', 'w', 'i', 'c', 'e']

다섯번째, 반복 연산도 가능하다. * 연산자로 시퀀스를 반복할 수 있다.

d = "shy" * 3
print(d) #shyshyshy

예시

my_list = ["Apple", "Banana", "Chamwae", "Durian]
my_str = "Impossible"

var1 = my_list[2]
print(var1) # Chamwae

var2 = my_str[2:]
print(var2) # possible
my_list = ["Apple", "Banana", "Chamwae", "Durian]
my_str = "Impossible"

var1 = len(my_str)
print(var1) # 10

var2 = "Egg" in my_list
print(var2) # False

Dictionary (딕셔너리)

Dictionary란

Dictionary는 '사전'을 의미하며, 사전을 통해 어떤 단어의 의미를 알아내곤 한다. 영/한 사전을 예를 들어보자. 우리는 사전을 통해 특정 영어 단어를 검색 혹은 찾아보고, 찾아낸 단어의 의미를 알 수 있다. "Apple"을 검색하면 "사과"라는 의미가 나오듯.

또 다른 예시를 보면, 우리가 회원가입을 할 때도 이와 유사한 방식을 띈다. 회원가입 창에서 '성'을 입력하는 곳과 '이름'을 입력하는 곳이 있다고 해보자. 내 정보를 입력하게 되면, '성'에는 '신(Shin)' 그리고 '이름'에는 '민승(minseung)'을 입력할 것이다. 이처럼 짝꿍처럼 따라다닌다.

이렇게 단어-의미, '성'-'신(Shin)'등은 서로 짝꿍을 이루는 자료형이라고 생각할 수 있다. 딕셔너리는 이처럼 짝꿍이 있는 자료형을 의미한다.

Dictionary 표현 방법

{} - 중괄호로 묶어서 표현한다.

dict_zero = {} # 빈 딕셔너리
person = {'name':'Minseung', 'age': 25}

예시에서 보면, 콜론(:)을 중심으로 두 문자 혹은 자료가 존재하는 것처럼 보인다. 이는 딕셔너리의 구조 때문인데, 딕셔너리는 {key:value} 형태로 key-value가 한 쌍처럼 이루어져 있다.
이러한 구조로 인해 우리는 key 값을 알면 value를 알 수 있다.

  • key
    딕셔너리에서 key는 열쇠처럼 자료를 꺼낼 수 있는 도구이다. 또한, key는 딕셔너리 구조에서 콜론(:)을 중심으로 왼쪽에 있는 것을 의미한다.

  • value
    value는 딕셔너리에서 key로 꺼낸 자료를 의미한다. key와 반대로 콜론(:)을 중심으로 오른쪽에 있는 자료를 의미한다.

Dictionary[key]

  • Dictionary에서 자료를 꺼내기
person = {'name':'Minseung', 'age':25'}
print(person['name']) # Minseung
print(person['age']) # 25

# person -> dictionary, 'age' -> key

딕셔너리에서 자료를 꺼내오는 방식은 마치 인덱싱을 통해 자료를 꺼내오는 것과 유사하다.

  • Dictionary에서 자료를 추가하기
person = {'name':'Minseung', 'age':25'}
person['hometown'] = 'Incheon'

# person -> dictionary, 'hometown' -> key, Incheon -> value
  • del함수로 Dictionary의 원소 삭제
person = {'name':'Minseung', 'age':25'}
del person['age']

print(person)

# {'name':'Minseung'}

Dictionary의 특징

key는 변할 수 없는 자료형만 가능하다. 다시 말해, 리스트는 안되고 튜플은 가능하다 !

data = {[1,2,3]: 'Alphabet'} # Error
data = {(1,2,3): 'Number'} # OK

예를들어 우리가 자물쇠를 열 때 열쇠가 필요한데, 그 열쇠가 매번 모양이 바뀌면 같은 자물쇠를 열 수 있을까? 불가능하다.
Dictionary에서도 key의 모양이 바뀔 염려가 있는 자료형은 key의 역할을 할 수 없으며, 대표적인 것이 바로 리스트이다. (리스트는 값을 추가, 제거 등이 가능하기 때문이다.)

예시

my_dict = {'사과':'apple', '바나나':'banana', '당근':'carrot'}

# '사과'를 key로 넣어 나온 value를 변수 var1에 넣기 
var1 = my_dict['사과']
print(var1) # 'apple'

# my_dict에서 당근-carrot을 제거
del my_dict['당근']

# my_dict에서 체리-cherry를 추가
my_dict['체리'] = 'cherry' 
my_dict = {}

my_dict[1] = 'Integer'
my_dict['a'] = 'String'
my_dict[(1, 2, 3)] = 'Tuple'

print(my_dict) # {1:'Integer', 'a':'String', (1, 2, 3):'Tuple'}

# [1, 2, 3]이라는 리스트를 key 값으로 사용해서 대응관계 형성하기 
try:
	my_dict[[1, 2, 3]] = "List"
except TypeError:
	print("List는 Dictionary의 key가 될 수 없습니다.")

# 결과: List는 Dictionary의 key가 될 수 없습니다.

여기까지.. 오늘은 NIPA AI 온라인 교육 - 핵심 파이썬 기초의 4번째 강의에 대해 복습을 해보았다. 강의가 진행되면 될수록 양이 많아지고 있는데, 그만큼 많이 배울 수 있다고 생각한다.
앞으로 배울 내용들은 좀 더 심화되고, 복잡한 내용이 많아질텐데 최대한 열심히 수강하고 복습하면서 내 것으로 만들 수 있도록 노력해야겠다.

혹시라도 오타나 문제될 부분이 있다면 말씀해주세욤. 꼼꼼히 검토하고 반영하도록 하겠습니다 :)

다음은 5번째 강의에 대해 알아보도록 하겠다 !! 그럼 이만 !

profile
서비스 기획, 블록체인, 디지털 자산, 데이터 분석

0개의 댓글

관련 채용 정보