티스토리 뷰

Python

[Python] 자료형 - 리스트 자료형

ellie.strong 2020. 10. 20. 22:17
728x90

리스트 자료형

여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용한다. 

C나 자바와 같은 프로그래밍 언어의 배열(Array) 기능을 포함하고 있으며, 내부적으로 연결 리스트 자료구조를 채택하고 있어 append(), remove() 등의 메서드를 지원한다. C++의 STL vector와 유사하며, 리스트 대신에 배열 혹은 테이블이라고 부르기도한다. 

 

리스트 만들기

대괄호([])안에 원소를 넣어 초기화하며, 쉼표(,)로 원소를 구분한다. 

a = [1, 2, 3]

리스트의 원소에 접근할 때는 인덱스(Index) 값을 괄호 안에 넣는다. 인덱스는 0부터 시작한다. 

a[2] # 인덱스 2의 값 3을 가리킨다. 

비어 있는 리스트를 선언하고자 할 때는 list() 혹은 간단히 대괄호([])를 이용할 수 있다. 

a = list()
a = []

코딩 테스트>> 주로 크기가 N인 1차원 리스트를 초기화해야 하는 경우가 많다. 

n = 10
a = [0] * n # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

 

리스트의 인덱싱과 슬라이싱

인덱싱(Indexing) : 인덱스값을 입력하여 리스트의 특정한 원소에 접근하는 것

인덱스값으로 양의 정수와 음의 정수를 모두 사용할 수 있으며, 음의 정수로 넣으면 원소를 거꾸로 탐색하게 된다. 

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

a[-1]    # 뒤에서 첫 번째 원소인 9 출력
a[-3]    # 뒤에서 세 번째 원소인 7 출력
a[3] = 7 # 네 번째 원소 값인 4가 7로 변경

슬라이싱(Slicing) : 리스트에서 연속적인 위치를 갖는 원소들을 가져오는 것

대괄호 안에 콜론(:)을 넣어서 시작 인덱스와 (끝 인덱스 -1)을 설정할 수 있다. 

a[1:4] # 두 번째 원소부터 네 번째 원소까지 가져온다. [2, 3, 4]

 

리스트 컴프리헨션

대괄호([]) 안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다. 

 

예) 0부터 19까지의 수 중에서 홀수만 포함하는 리스트를 만드는 경우

array = [i for i in range(20) if i % 2 == 1] # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

일반적인 소스코드의 경우

array = []
for i in range(20):
    if i % 2 == 1:
        array.append(i)

예) 1부터 9까지 수의 제곱 값을 포함하는 리스트를 만드는 경우

array = [i * i for i in range(1, 10)] # [1, 4, 9, 16, 25, 36, 49, 64, 81]

코딩 테스트>> 2차원 리스트를 초기화할 때 반드시 리스트 컴프리헨션을 사용해야한다. 

예) N X M 크기의 2차원 리스트를 초기화하는 경우

n = 3
m = 4
array = [[0] * m for _ in range(n)] # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

다음과 같은 방법으로 초기화할 경우 내부적으로 포함된 3개의 리스트가 모두 동일한 객체에 대한 3개의 레퍼런스로 인식되어 원치 않은 실행결과가 나올 수 있다. 

n = 3
m = 4
array = [[0] * m] * n # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
array[1][1] = 5       # [[0, 5, 0, 0], [0, 5, 0, 0], [0, 5, 0, 0]]

언더바(_)

반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 사용한다. 

예) "Hello World"를 5번 출력하는 경우

for _ in range(5):
    print("Hello World")

 

 

리스트 관련 기타 메서드

a = [1, 4, 3]

append() : 리스트에 원소를 하나 삽입할 때 사용한다. O(1)

a.append(2) # [1, 4, 3, 2]

sort() : 오름차순으로 정렬한다. O(NlogN)

a.sort()               # [1, 2, 3, 4]
a.sort(reverse = True) # [4, 3, 2, 1]

reverse() : 리스트의 원소의 순서를 모두 뒤집어 놓는다. O(N)

a.reverse() # [1, 2, 3, 4]

insert() : 특정한 인덱스 위치에 원소를 삽입할 때 사용한다. O(N)

a.insert(2, 3) # [1, 2, 3, 3, 4] 인덱스 2에 3을 추가한다. 

count() : 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용한다. O(N)

a.count(3) # 2 값이 3인 데이터의 개수

remove() : 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 처음의 하나만 제거한다. O(N)

a.remove(1) # [2, 3, 3, 4] 값이 1인 데이터를 삭제한다. 

코딩 테스트>> insert() 함수와 remove() 함수를 남발하면 '시간 초과'로 테스트를 통과하지 못할 수 있다. 따라서 insert() 함수와 remove() 함수를 여러번 사용해야할 경우 다른 방법을 생각해볼 필요가 있다. 

예) 특정한 값의 원소를 모두 제거해야하는 경우 (파이썬의 경우 remove_all() 함수를 지원하지 않는다.) 

a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}

# remove_set에 포함되지 않은 값만을 저장
result = [i for i in a if i not in remove_set] # [1, 2, 4]

 

728x90
댓글
공지사항
최근에 올라온 글