Python/파이썬 문법

[파이썬 문법] 리스트 자료형

서노리 2021. 12. 25. 01:40
반응형

리스트 자료형

파이썬의 리스트 자료형은 C나 자바와 같은 언어의 배열 기능을 포함하고 있으며, 내부적으로 연결 리스트 자료구조를 채택하고 있어서 append(), remove() 등의 메서드를 지원한다. 파이썬의 리스트는 C++ 의 STL vector와 유사하다.

 

리스트 만들기

리스트는 대괄호([]) 안에 원소를 넣어 초기화하며, 쉼표로 원소를 구분한다. 리스트의 원소에 접근할 때는 인덱스를 이용하며 0부터 N시작한다. 비어있는 리스트를 선언할 때는 list() 또는 비어있는 대괄호([])를 사용할 수 있다.

a = [1,2,3,4,5]
print(a)

print(a[3]) # 4번째 원소에 접근

a = list() # 비어있는 리스트 생성 방법 1 
print(a)

a = [] # 비어있는 리스트 생성 방법 2
print(a)

※ 크기가 N이고 모든 값이 0인 1차원 리스트 초기화 하기

n = 10
a = [0] * n
print(a)

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

파이썬은 인덱스 값으로 음수를 사용할 수 있는데 음수를 넣으면 원소를 거꾸로 탐색할 수 있다.

예를 들어 인덱스에 -1을 넣으면 가장 마지막 원소가 출력된다.

a = [1,2,3,4,5,6,7,8,9]
# 뒤에서 첫 번째 원소 출력
print(a[-1])

# 뒤에서 세 번째 원소 출력
print(a[-3])

 또한 리스트에서 연속적인 위치를 갖는 원소들을 가져와야 할 때는 슬라이싱을 이용할 수 있다. 

대괄호 안에 콜론(:)을 넣어서 시작 인덱스와 (끝 인덱스 - 1)을 설정해주면 된다. 예를 들어 두 번째 원소부터 다섯 번째 원소까지의 모든 데이터를 갖는 리스트를 가져오고 싶다면 a[1 : 5]이라고 쓴다.

a = [1,2,3,4,5,6,7,8,9]
# 두 번째 원소부터 다섯 번째 원소까지 출력
print(a[1 : 5])

리스트 컴프리헨션

리스트 컴프리헨션은 리스트를 초기화하는 방법 중 하나이다. 리스트 컴프리헨션을 이용하면 대괄호([]) 안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다. 

예를 들어 0부터 19까지의 수 중에서 홀수만 포함하는 리스트를 만들고자 할 때는 다음과 같은 리스트를 초기화할 수 있다. 이 경우 한 줄의 소스코드로 리스트를 초기화할 수 있어 매우 간편하다.

# 0부터 19까지 값 중 홀수만 포함하는 리스트
array = [i for i in range(20) if i % 2 == 1]
print(array)

참고로 위 소스코드를 일반적인 소스코드로 작성하면 다음과 같다.

# 0부터 19까지 값 중 홀수만 포함하는 리스트
array = []
for i in range(20):
  if i % 2 == 1:
    array.append(i)
print(array)

다른 예시로 1부터 9까지 제곱 값을 포함하는 리스트를 만드는 방법이다.

# 1부터 9까지의 수의 제곱 값을 포함하는 리스트
array = [i * i for i in range(1,10)]
print(array)

※ 크기가 N x M 이고 모든 값이 0인 2차원 리스트 초기화 하기

# N x M 크기의 2차원 리스트 초기화
n = 3
m = 4
array = [[0] * m for i in range(n)]
print(array)

참고로 특정 크기의 2차원 리스트를 초기화할 때는 반드시 리스트 컴프리헨션을 이용해야 한다. 만약 다음과 같이 N x M 크기의 2차원 리스트를 초기화한다면, 의도치 않은 결과가 나올 수 있다.

# N * M 크기의 2차원 리스트 초기화(잘못된 방법)
n = 3
m = 4
array = [[0] * m] * n
array[1][1] = 5
print(array)

array[1][1] 의 값을 5로 바꾸었을 뿐인데 모든 배열의 1번 인덱스 값이 5로 바뀌었다.

이는 내부적으로 포함된 3개의 리스트가 모두 동일한 객체로 인식되기 때문에 발생된 결과이다. 따라서 특정한 크기를 가지는 2차원 리스트를 초기화할 때는 리스트 컴프리헨션을 이용하는 것이 좋다.

 

리스트 관련 메소드

메서드명 사용법 설명 시간복잡도
append() 변수명.append(특정 값) 리스트에 원소를 하나 삽입한다. O(1)
sort() 변수명.sort() 오름차순으로 정렬한다. O(NlogN)
변수명.sort(reverse = True) 내림차순으로 정렬한다. O(NlogN)
reverse() 변수명.reverse() 리스트의 원소의 순서를 모두 뒤집어 놓는다. O(N)
insert() 변수명.insert(삽입할 인덱스, 삽입할 값) 특정한 인덱스 위치에 원소를 삽입한다. O(N)
count() 변수명.count(특정 값) 리스트에서 특정한 값을 가지는 데이터의 개수를 센다. O(N)
remove() 변수명.remove(특정 값) 특정한 값을 가진 원소 중 하나만 제거한다. O(N)

append() 함수의 시간복잡도가 O(1) 임에 비해 insert() 함수의 경우는 중간에 원소를 삽입한 후 리스트의 원소 위치를 조정해줘야 하기 때문에 O(N)이 소요된다. remove()도 마찬가지로 중간에 있는 원소를 삭제한 후 리스트의 원소 위치를 조정해줘야 하기 때문에 O(N)이 소요된다. 

 

※특정한 값의 원소를 모두 제거하는 방법

다른 언어에서는 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]
print(result)

3, 5에 해당하는 모든 원소를 삭제된 결과가 출력되었다.


참고자료: 이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 지음(한빛미디어)

반응형