본문 바로가기
파이썬 독학

[파이썬 독학] 데이터 타입 리스트(List)의 모든 것

by 데싸루나 2023. 2. 28.

파이썬을 처음 공부할 때 가장 잘 이해해야 하는 부분이 바로 데이터타입입니다. 그중 리스트(List)는 프로그래밍에 가장 많이 사용되는 데이터타입입니다. 리스트의 개념을 정확히 이해하고 어떻게 코딩에 활용할 수 있는지 자세히 알아보도록 하겠습니다. 

 

파이썬-Python-리스트-List
파이썬-Python-리스트-List

 

파이썬 데이터타입, 리스트(List)란?

파이썬은 활용도가 높은 프로그래밍 언어로, 다양한 데이터 타입이 기본으로 포함되어 있습니다. 가장 일반적으로 사용되는 데이터 타입 중 하나는 리스트입니다. 리스트는 숫자, 문자열(String) 또는 심지어 리스트 안에 리스트가 들어갈 수 있을 정도로 어떤 타입이든 될 수 있는 엘리먼트들의 집합체입니다. 리스트는 대량의 데이터를 체계적으로 저장하고 조작할 수 있기 때문에 프로그래밍에서 자주 사용되고 그렇기 때문에 개념에 대해 확실하게 이해할 필요가 있습니다. 리스트는 기본적으로 유동적이므로 필요에 따라 크기를 조정하거나 수정할 수 있습니다. 따라서 데이터 정렬, 검색, 필터링과 같은 다양한 프로그래밍 작업에 유용한 데이터 타입입니다. 또한 리스트를 반복문과 함께 사용하면 프로그램 흐름을 제어하는 데 유용한 도구로 사용할 수 있습니다. 이렇게 유용한 리스트를 어떻게 어떤 경우에 활용을 할 수 있는지 차근차근 알아보도록 하겠습니다.

 

 

파이썬 리스트 생성하는 방법

파이썬의 리스트는 대괄호(square bracket) '[ ]'를 사용하고 엘리먼트 사이에 구분은 ', '(쉼표)로 구분합니다. 리스트를 생성하는 다음의 코드 예제를 함께 보시죠. 

# 정수로 이루어진 리스트 생성
numbers = [1, 2, 3, 4, 5]

# 문자열로 이루어진 리스트 생성
fruits = ['apple', 'banana', 'cherry', 'date']

# 여러가지 타입이 섞인 리스트 생성
mixed = [1, 'two', 3.0, 'four',[1,2,3]]

앞에서 말씀 드렸다시피 리스트는 유동적이기 때문에, 위의 예제처럼 그 어떤 타입도 엘리먼트로 가질 수 있습니다. 또 마지막줄 예시처럼 여러 가지 데이터타입이 섞여있는 형태의 리스트도 만들 수 있습니다. 이는 리스트가 여기저기 다재다능하게 쓰일 수 있는 가장 큰 이유입니다. 

 

파이썬 리스트 엘리먼트 추가, 삭제, 수정(변경) 등 기본적인 조작 방법

그러면 리스트에 엘리먼트를 추가, 삭제, 수정 등 조작은 어떻게 할 수 있을까요? 아래 코드에 가장 기본적으로 쓰이는 리스트의 메소드(method)를 담아봤습니다. 주석에 각각이 어떤 역할을 하는지 기재해 두었으니 대표적인 리스트 메소드에 대해 살펴보세요. 

 

 

# 리스트 생성
my_list = [1, 2, 3, 4, 5]

# 엘리먼트 추가
my_list.append(6)
print(my_list)   # output: [1, 2, 3, 4, 5, 6]

# 리스트에 리스트 concat하기
my_list.extend([7, 8])
print(my_list)   # output: [1, 2, 3, 4, 5, 6, 7, 8]

# 리스트 특정위치에 특정 엘리먼트 삽입하기
my_list.insert(3, 'four')
print(my_list)   # output: [1, 2, 3, 'four', 4, 5, 6, 7, 8]

# 특정 엘리먼트 삭제하기
my_list.remove('four')
print(my_list)   # output: [1, 2, 3, 4, 5, 6, 7, 8]

# 특정 위치에 있는 엘리먼트 꺼내오기
popped_element = my_list.pop(3)
print(popped_element)  # output: 4
print(my_list)   # output: [1, 2, 3, 5, 6, 7, 8]

# 특정값을 가지는 엘리먼트의 위치 찾기
index_of_five = my_list.index(5)
print(index_of_five)  # output: 3

# 특정 값을 가지는 엘리먼트가 리스트 안에 몇개있는지 카운트 하기 
count_of_five = my_list.count(5)
print(count_of_five)  # output: 1

# 리스트 안에 엘리먼트 정렬하기
my_list.sort()
print(my_list)   # output: [1, 2, 3, 5, 6, 7, 8]

# 리스트 안에 엘리먼트 역순으로 바꾸기
my_list.reverse()
print(my_list)   # output: [8, 7, 6, 5, 3, 2, 1]

# 리스트 카피하기
new_list = my_list.copy()
print(new_list)  # output: [8, 7, 6, 5, 3, 2, 1]

 

 

파이썬 리스트 인덱싱과 슬라이싱 하는 방법(List Indexing and Slicing)

리스트 인덱싱(Indexing)

리스트는 앞에서 보신 것 처럼 여러 개의 엘리먼트들의 집합체입니다. 그래서 하나의 리스트 안에 들어있는 각각의 엘리먼트를 접근하는 방법이 있어야 하는데, 그때 사용되는 게 리스트 인덱싱(Indexing)입니다. 리스트 안에 특정 엘리먼트의 위치를 가리키는 것이죠. 아래 예시를 같이 보시겠습니다. 

fruits = ['apple', 'banana', 'cherry', 'date']

# 위의 리스트에서 banana만 출력하려고 할 때 인덱싱(Indexing) 하는 방법
print(fruits[1])  # 'banana'

print(fruits.index('cherry')) # 2

리스트를 인덱싱(Indexing)할 때 주의해야하는 것은 가장 처음에 있는 엘리먼트가 0부터 시작한다는 것입니다. 가장 첫 엘리먼트가 1이 아닌 0이라는 것을 늘 기억해야 합니다. 0부터 차례대로 1, 2, 3의 인덱스를 가집니다. 위의 경우 fruits[0] 이 apple, fruits[3]이 date입니다. 마지막줄 예시처럼 특정 엘리먼트의 위치(인덱스)를 알고 싶으면 "리스트명.index('엘리먼트의 값')"과 같이 index메소드를 활용하면 됩니다.  

 

리스트 슬라이싱(Slicing)

리스트 슬라이싱(Slicing)이란 리스트의 특정 부분만 잘라서 추출하는 것을 말합니다. 우선 아래 예제를 먼저 보고 설명드리겠습니다. 

fruits = ['apple', 'banana', 'cherry', 'date']

# banana와 cherry만 추출해내도록 리스트 슬라이싱하는 방법
print(fruits[1:3])  # ['banana', 'cherry']

fruits[1:3]과 같이 [ ] 대괄호 안에 추출을 시작할 인덱스와 추출을 끝낼 인덱스를 순서대로 : 를 사이에 두고 넣어주면 되는데 여기서 주의해야 할 점은 첫 번째 넣어준 인덱스는 슬라이싱 결과에 포함이 되고, 두 번째 넣어준 인덱스는 슬라이싱 결과에 포함이 되지 않는다는 것입니다. 그러니까 뒤에있는 인덱스의 -1 까지를 잘라서 추출하게 됩니다. 0번, 1번 인덱스의 엘리먼트들을 추출하고 싶을 때는 list[0:2] 이런 식으로 기재를 하는 것이죠. 리스트 슬라이싱에 있어서 가장 주의해야 할 부분입니다. 

 

 

파이썬 리스트가 가진 강력한 장점 : 리스트 컴프리헨션(List Comprehension)

파이썬 리스트 데이터타입이 가지는 아주 강력한 장점은 바로 리스트 컴프리헨션(List Comprehension)이 가능하다는 점입니다. 리스트 컴프리헨션이란, 리스트의 엘리먼트 하나하나 어떤 계산을 통해 넣어주고 싶다고 할 때, 가장 쉽게 떠올릴 수 있는 방법은 for loop을 돌려서 엘리먼트 개수만큼 반복하면서 하나하나 계산하며 넣어주는 방법이 있을 것입니다. 하지만 파이썬에서는 이런 반복문 없이 리스트 컴프리헨션을 사용하면 단 한 줄로 코딩이 가능합니다. 좀 더 상세하게 같이 살펴보겠습니다. 

 

리스트 컴프리헨션(List Compreension) 규칙

new_list = [expression for element in old_list if condition]

[위의 규칙에서 각각이 의미하는 것]

new_list: 새롭게 만들어진 리스트를 저장할 리스트명

expression: old_list의 각 엘리먼트들에 적용할 계산식

element: old_list에서 현재 엘리먼트(반복문처럼 순서대로 하나씩 차례대로 들어옴)

old_list: 변경하고자 하는 리스트명

condition: (optional) 컨디션이 기재되면 이 컨디션을 만족하는 old_list의 엘리먼트들만 expression을 적용함

 

이제 아래 코드 예시를 같이 보시죠. 

old_list = [1, 2, 3, 4, 5]
new_list = [x**2 for x in old_list]
print(new_list)  # [1, 4, 9, 16, 25]

위의 코드에서는 old_list의 각 엘리먼트들에 대해 제곱을 한 다음에 new_list에 넣어주는 리스트 컴프리헨션입니다.

old_list = [1, 2, 3, 4, 5]
new_list = [x for x in old_list if x % 2 == 0]
print(new_list)  # [2, 4]

위의 코드는 if 조건을 붙여줌으로써 old_list 엘리먼트 중 2의 배수인 것들만 추출을 해서 new_list에 넣어주는 리스트 컴프리헨션입니다. 

 

네스티드 리스트 컴프리헨션(Nested List Compreension) 규칙

new_list = [expression(include element1, element2, ... elementN) for element1 in list1 for element2 in list2 ... for elementN in listN if condition]

 

리스트 컴프리헨션을 응용하여 Nested 형태로도 사용할 수 있는데요. 이때 규칙은 위와 같습니다. 이 부분은 코드를 바로 보시는 게 이해가 더 빠르실 것 같습니다. 아래 예제를 같이 보시죠. 

 

new_list = [x*y for x in [1, 2, 3] for y in [4, 5, 6]] 
print(new_list) # [4, 5, 6, 8, 10, 12, 12, 15, 18]

list1 = ['a', 'b', 'c']
list2 = [1, 2, 3]
new_list = [(x, y) for x in list1 for y in list2]
print(new_list)  # [('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]

이렇게 expression에 여러 개의 변수가 있는 경우 각각의 변수를 다른 리스트에서 가져올 수 있습니다. for x in list1 for y in list2 이런 식으로 명시해 줌으로써 x는 list1에서 가져오고, y는 list2에서 가져오라고 명시해 줄 수 있습니다. 

 

이해에 도움이 되는 파이썬 리스트(List) 관련 FAQ

1. 리스트 안에 특정 엘리먼트가 있는지 체크하는 방법은? 

- 'in' 키워드를 사용하면 됩니다. 조건문에서 'if element in my_list'와 같이 체크할 수 있습니다.

 

2. 리스트 안에 중복된 엘리먼트를 중복제거 하는 방법은?

- 파이썬의 데이터 타입 set을 이용하여 list의 중복된 엘리먼트 제거를 할 수 있습니다. 'my_list = list(set(my_list))'와 같이 사용하시면 됩니다. 

 

3. 리스트의 길이(엘리먼트가 몇 개 들어있는지)를 체크하는 방법은?

- 'len()' 함수를 사용하면 됩니다. 'length = len(my_list)'와 같이 사용할 수 있습니다. 

 

4. 두 개의 리스트를 concatenate 하는 방법은? 

- '+'를 사용하면 간편하게 concat 할 수 있습니다. 'new_list = list1 + list2'와 같이 사용할 수 있습니다.

 

 

댓글