▼2020년/파이썬 기초

[Python] 파이썬에서의 자료형, 리스트형 (3/7)

ITISIK 2020. 1. 21. 16:04
반응형

  이전 글에서는 파이썬의 자료형 중 문자형에 대해서 알아보았다. 문자형과 숫자형에 대해서 제대로 이해하고 있다면, 리스트형에 대해서도 어렵지 않게 이해할 수 있으리라 생각한다.

 

 

리스트형

  리스트형은 말 그대로 나열이 되어있는 리스트 형태를 하고 있다. 나열(리스팅)되는 각각은 문자형 혹은 숫자형 더 나아가 리스트 형 등으로 이루어져 있다. 이때 나열되어 있는 각각을 원소 혹은 요소 등으로 표현한다.(Element)

 

  리스트는 아래와 같이 선언 및 할당한다.

my_list = ['수', 'number', 941219, 'ITisIK']

 

  수나 문자 각각을 적되 구분은 콤마(,)로 하고 대괄호([])로 감싸준다. 아래와 같이 다양한 형태로 리스트를 선언 및 할당할 수 있다.

my_list_ex1 = []
my_list_ex2 = [1]
my_list_ex3 = [1, 2]
my_list_ex4 = ['text', 'text', 'text']
my_list_ex5 = [1, 2, 'text']
my_list_ex6 = [1, 2, 'text', ['Python', 'R', 'C', 'Java']]

  my_list_ex1처럼 완전히 비어있는 리스트를 만들수도 있고, my_list_ex2처럼 숫자 하나만을 값으로 가질 수도 있으며, 문자 하나만을 값으로 가질 수도 있다. my_list_ex3, 4처럼 숫자나 문자를 여러개 나열할 수 있으며 중복해서 저장할 수 있다. my_list_ex5처럼 수자 문자를 섞어서 표현할 수 있으며, my_list_ex6처럼 구성성분의 자료형을 수나 문자가 아닌 리스트 형태를 사용할 수도 있다.

 

  이러한 리스트 형태는 속성중에 길이라는 것을 갖는다. 길이를 쉽게 말하면 요소의 개수라고 할수 있다. 위 여섯개의 리스트의 길이를 예상하면서 아래의 코드를 보자.

len(my_list_ex1)
len(my_list_ex2)
len(my_list_ex3)
len(my_list_ex4)
len(my_list_ex5)
len(my_list_ex6)

 

 

  마지막 my_liste_ex6의 경우 길이가 4로 나오는 것을 볼 수 있다. 즉 리스트의 요소로 있는 리스트는, 겉 리스트의 길이에 영향을 주지 않는다고 볼 수 있다.

 

 

리스트 인덱싱

  리스트 형에서도 문자형에서 배웠던 인덱싱과 슬라이싱이 존재한다. 인덱싱은 특정 위치에 있는 문자를 반환하기 위해 0부터 시작하는 숫자주소를 사용했던것이고, 슬라이싱은 햄을 적당한 두께로 썰어내듯이 문자형에서 일부분을 취할 때 콜론(:)기호를 사용해서 추출해냈었다.

my_list_ex6 = [1, 2, 'text', ['Python', 'R', 'C', 'Java']]

my_list_ex6를 기준으로 알아보고자 한다.

my_list_ex6[1]
# 2

my_list_ex6[3]
# [1, 2, 'text', ['Python', 'R', 'C', 'Java']]

my_list_ex6[1] + my_list_ex6[0]
# 3
# 2와 1은 두개 모두 숫자형이기 때문에, 실제 산수 덧셈 연산을 수행한다.

 

  그렇다면, my_list_ex6[3]이 가르키는 리스트에서 Python만 추출하기 위해선 어떻게 해야할까. my_list_ex6[3]이라는 이름의 리스트에서 첫 번째 요소를 추출하기 위해서 어떻게 할지 생각해보면 된다.

my_list_ex6[3][0]

  이렇게 직관적으로 가져올 수 있다. 문자형에서와 마찬가지로 인덱스 값에 음수가 들어갈 수 있으며, 의미는 동일하다.

인덱스가  -1 이면 가장 마지막 요소를 가져온다

 

 

리스트 슬라이싱

  리스트 인덱싱이 문자형과 동일했듯이, 슬라이싱 또한 동일하다. 한 번 더 복습하는 느낌으로 보면 된다.

my_list_ex6[0:3]
# 1번째부터 3번째까지를 호출했으므로 [1, 2, 'text']가 나온다.

my_list_ex6[:3]
# [1, 2, 'text']

my_list_ex6[3:]
# [['Python', 'R', 'C', 'Java']]

 

리스트 연산

  문자형에서 했던 연산과 유사하다. 문자형에서 더하기(+)연산과 곱하기(*)연산을 진행했었는데, 문자열이 붙거나 반복되는 형태로 연산됐었다. 단, 리스트 연산에서 유의해야 할 점은, 숫자와 문자간의 연산은 자료형이 같지 않아 오류를 낸다는 점이다. 만약 숫자형과 문자형을 섞어서 표현하고 싶다면 약간의 변형을 해주어야 한다. 이 글의 말미에 소개하겠다.

my_list_ex7 = [0, 9, 5, 2]
my_list_ex8 = [10, 1, 5, 8]

my_list_ex7 + my_list_ex8
# [0, 9, 5, 2, 10, 1, 5, 8]

  각 요소가 모두 숫자형이어서 실제 수의 덧셈이 이뤄질것 같지만, 결국 겉은 리스트 형태이기 때문에 위와 같이 리스트가 합쳐진 모양의 결과가 나온다.

 

my_list_ex7 * 3
[0, 9, 5, 2, 0, 9, 5, 2, 0, 9, 5, 2]

  곱하기 연산도 마찬가지로 리스트를 반복하는 것으로 사용된다.

 

  숫자형과 문자형을 가지고 +연산을 하기 위해서는 형이 동일해야 한다. 그런데 문자를 숫자형으로 바꿀 수는 없으므로 숫자형을 문자형으로 바꾸어 표현하게 된다. 코드와 그 결과는 아래와 같다.

 

my_list_ex9 = ['숫자', 142857]
my_list_ex9[0] + 1
my_list_ex9[1] + "은 신비한 숫자야"

my_list_ex9[0] + "1"
str(my_list_ex9[1]) + "은 신비한 숫자야"

  위에서 사용된 str()함수는 string의 줄임말로, 괄호 안에 있는 값을 문자형으로 바꾸어준다.

 

리스트 원소 수정 삭제

  리스트는 기존 문자형과는 달리 특정 인덱스(위치)에 있는 값만의 변경이 가능하다. 아래 코드와 결과로 이해하자.

list_modify = [1, "test", 3]
list_modify
# [1, 'test', 3]

list_modify[1] = 2
list_modify
# [1, 2, 3]

 

삭제는 del()함수를 이용한다.

list_delete = ['1', 1, '2', 2, 'text']
list_delete
# ['1', 1, '2', 2, 'text']

del(list_delete[4])
list_delete
# ['1', 1, '2', 2]

 

리스트 관련 함수

  기존의 리스트에 원소를 (맨 마지막 위치에)추가, 정렬, (특정 위치에)삽입, 삭제하거나 기존의 순서를 거꾸로 뒤집을 때, 특정 원소의 위치가 궁금할 때 등 다양한 상황에서 사용하면 유용한 함수 몇 가지를 알아보려고 한다.

 

  기존의 리스트의 맨 마지막 위치에 원소를 추가하는 append() 함수

    * append() 함수의 소괄호 안에는 하나의 원소밖에 올 수없다. 즉 여러개의 원소를 append를 이용해서 한 번에 추가하는 방법은 없다.

apnd = ['0', '1', '2']
apnd.append('3')
apnd
# ['0', '1', '2', '3']

 

  이렇게 추가된 apnd의 뒤에 '4'와 '5'를 한 번에 넣으려고 아래와 같이 코드를 짜보았지만, 생각처럼 되지 않는다.

apnd = ['0', '1', '2']
apnd.append(['4', '5'])
apnd
# ['0', '1', '2', '3', ['4', '5']]

  아예 ['4', '5'] 인 리스트가 들어가 버린다. 즉, append는 하나의 원소만을 맨 뒤에 추가하는 함수로 알고 있어야 한다.

 

  여러개의 원소를 한 번에 맨 마지막 위치에 추가하는 extend() 함수

new_apnd = ['0', '1', '2']
new_apnd.extend(['3', '4', '5'])
new_apnd
# ['0', '1', '2', '3', '4', '5']

 

  맨 뒤가 아니라 특정한 위치에 요소를 삽입하는 insert() 함수

    * append 함수와 마찬가지로 하나의 원소만 삽입할 수 있다.

insrt = [2, 3, 4]
insrt.insert(0, 1)
insrt
[1, 2, 3, 4]

insrt.insert(0, 0)
insrt
[0, 1, 2, 3, 4]

insrt.insert(5, 5)
insrt
[0, 1, 2, 3, 4, 5]

 

 

리스트를 정렬하기 위한 함수 sort() 함수

chaos1 = [999, 5, 1, 23, 6, 4, 9, 11]
chaos2 = ['a', 'd', 'apple', 'c']
chaos3 = [999, 'a', 5, 'apple', 1, 'c', 23]

chaos1.sort()
chaos1
# [1, 4, 5, 6, 9, 11, 23, 999]

chaos2.sort()
chaos2
# ['a', 'apple', 'c', 'd']

chaos3.sort()
chaos3
# [999, 'a', 5, 'apple', 1, 'c', 23]

  숫자만 담긴 리스트와 문자만 담긴 리스트는 잘 정렬되는데 숫자와 문자가 함께 있을 때는 에러를 내며 정렬되지 않는 모습을 볼 수 있다.

 

 

리스트의 순서를 뒤바꿔주는 reverse() 함수

chaos1.reverse()
chaos1
# [999, 23, 11, 9, 6, 5, 4, 1]

chaos2.reverse()
chaos2
# ['d', 'c', 'apple', 'a']

chaos3.reverse()
chaos3
# [23, 'c', 1, 'apple', 5, 'a', 999]

  reverse() 함수의 경우 기존의 리스트 순서를 거꾸로 뒤집는 함수이기 때문에 자료형에 구애받지 않고 모두 정상적으로 작동되는 것을 볼 수 있다.

 

 

특정 문자의 개수를 알려주는 count() 함수

list_index = [9, 99, 999, 1, 2, 3, 99, 999, 9, 999]
list_index.count(1)
# 1
list_index.count(9)
# 2
list_index.count(999)
# 3

 

 

특정 문자가 처음으로 나타나는 위치를 반환해주는 index() 함수

list_index.index(0)
# error

list_index.index(999)
# 2

  0이라는 원소는 없기 때문에 에러가 나고, 999라는 원소는 3번째에 처음으로 나타나기 때문에 그 인덱스인 2를 반환해준다.

 

 

리스트에서 첫 번째로 나오는 특정문자를 삭제하는 remove() 함수

  * 첫 번째로 나타나는 해당 문자만 삭제하기 때문에, count()함수를 이용해서 해당 문자가 몇 개 있는지 확인이 필요한 경우도 있다.

list_index.remove(1)
# 1이 삭제된다.

list_index.remove(999)
# 999중 가장 앞에 것이 삭제된다.

  리스트 가장 마지막에 위치한 요소를 출력해줌과 동시에 제거해주는 pop() 함수

  * 컴퓨터 사이언스의 Data Structure의 Stack을 알면 금방 이해할 수 있다. 나중에 파이썬으로 자료구조를 직접 구현할 일이 있을지는 모르겠지만, 우선은 pop()함수의 개념에 대해서만 짚고 마무리하려고 한다.

stack = ['운동하기', '퇴근하기', '일하기', '밥먹기', '일하기', '출근하기']
stack.pop()
# '출근하기'
stack
# ['운동하기', '퇴근하기', '일하기', '밥먹기', '일하기']
stack.pop()
# '일하기'
stack
# ['운동하기', '퇴근하기', '일하기', '밥먹기']
stack.pop()
# '밥먹기'
stack.pop()
# '일하기'
stack.pop()
# '퇴근하기'
stack.pop()
# '운동하기'
stack.pop()
# error
stack
# []

 

  다음 포스트에서는 리스트와 거의 비슷하지만 삽입, 수정, 삭제가 불가능한 튜플형에 대해서 다뤄려고 한다.

반응형