뚝딱햄 탈출기

[Python] 리스트 자료형 List data type : 리스트 컴프리헨션, 인덱싱, 슬라이싱, 리스트 연산, 기타 메서드 본문

Programming language/Python

[Python] 리스트 자료형 List data type : 리스트 컴프리헨션, 인덱싱, 슬라이싱, 리스트 연산, 기타 메서드

hyrmzz1 2023. 10. 1. 05:50
이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 저
APPENDIX A. 코딩 테스트를 위한 파이썬 문법 정리 내용

자료형 (데이터 타입, data type) 종류

  • 수 (Number)
  • 리스트 (List)
  • 문자열 (String)
  • 튜플 (Tuple)
  • 사전 (Dictionary)
  • 집합 (Set)

2023.10.02 - [Programming language/Python] - [Python] 자료형 (데이터 타입, data type) : number, list, string, tuple, dictionary, set

 

[Python] 자료형 (데이터 타입, data type) : number, list, string, tuple, dictionary, set

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 저 APPENDIX A. 코딩 테스트를 위한 파이썬 문법 정리 내용 파이썬의 자료형은 C/C++, Java와 같은 다른 언어에서 사용되는 기본 자료형을 제공

hyrmzz1.tistory.com

리스트 자료형

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

C나 Java와 같은 프로그래밍 언어의 배열(Array) 기능을 포함하며, 내부적으로 연결 리스트 자료구조를 채택하고 있어 append(), remove() 등의 메서드를 지원한다.

리스트 대신에 배열 혹은 테이블이라 부르기도 한다.

리스트 생성

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

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

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

# 빈 리스트 선언 방법
b = list()
c = []
print(b)	# []
print(c)	# []

인덱싱과 슬라이싱 indexing & slicing

인덱싱이란 인덱스 값을 입력하여 리스트의 특정 원소에 접근하는 것이다.

인덱스는 0부터 시작하고, 인덱스값은 양의 정수와 음의 정수를 모두 사용할 수 있다.
음의 정수를 넣으면 원소를 거꾸로 탐색한다.

 

출처 : https://curioso365.tistory.com/46

a = [1, 2, 3, 4, 5]

# 다섯 번째 원소에 접근
print(a[4])	# 5

# 뒤에서 첫 번째 원소에 접근
print(a[-1])	# 5

# 인덱스값을 이용한 원소 값 변경(수정)
print(a[2])	# 3
a[2] = 10
print(a[2])	# 10

# del 함수를 사용한 원소 값 삭제
del a[2]
print(a)	# [1, 2, 4, 5]

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

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

a = [1, 2, 3, 4, 5]

print(a[2 : 4])	# [3, 4]
print(a[ : 3]	# a[0 : 3]와 같음. [1, 2, 3]
print(a[3 : ]	# index 값이 3인 원소부터 끝까지 출력. [4, 5]

# 인덱스값이 음의 정수라면?
print(a[-2 : ]	# [4, 5]
print(a[ : -1])	# [1, 2, 3, 4]
print(a[-5 : -2]	# [1, 2, 3]

stride 설정

a[start : stop : stride]와 같이 슬라이싱할 때, stride는 요소를 취하는 빈도를 나타낸다.

stride는 슬라이스의 간격을 설정한다.

a = [1, 2, 3, 4, 5]

print(a[::2])	# [1, 3, 5]

# stride를 이용한 역순 정렬
print(a[::-1])	# stride가 음의 정수라면 역방향으로 슬라이싱됨. [5, 4, 3, 2, 1]

한 슬라이스에 start, end, stride를 모두 지정하면 에러가 발생할 수 있다.

에러를 방지하기 위해 stride는 start, end 인덱스와 함께 사용하는 것과, stride에 음수 값을 사용하는 것을 지양하자.

stride 사용 시 양의 정수를 사용하고, start와 end 없이 사용하자!

리스트 연산

# 리스트 더하기
a = [0, 1, 2]
b = [3, 4, 5]
print(a + b)	# [[0, 1, 2, 3, 4, 5]

# 리스트 반복
a = [0, 1, 2]
print(a * 3) # [0, 1, 2, 0, 1, 2, 0, 1, 2]

리스트 컴프리헨션

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

# 0부터 9까지의 수 중 홀수만 포함하는 리스트

# 일반적인 소스코드로 작성
array = []		# 빈 리스트 선언
for i in range(10):	# range(10)은 0부터 9까지의 숫자를 생성함.
	if i % 2 == 1:
    	array.append(i)	# append() 는 리스트 맨 뒤에 원소 하나를 삽입한다.
        
print(array)	# [1, 3, 5, 7, 9]

# 리스트 컴프리헨션 이용
array = [i for i in range(10) if i % 2 == 1]
print(array)	# [1, 3, 5, 7, 9]
# 1부터 5까지의 수의 제곱 값을 포함하는 리스트

# 일반적인 소스코드로 작성
array = []
for i in range(1, 6):
	array.append(i * i)

print(array)	# [1, 4, 9, 16, 25]

# 리스트 컴프리헨션 이용
array = [i * i for i in range(1, 6)]
print(array)	# [1, 4, 9, 16, 25]

리스트 컴프리헨션을 이용한 2차원 리스트 초기화

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

'''
line 4에서 사용한 언더바(_)가 하는 역할은?
파이썬 자료구조와 알고리즘에서 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바를 사용.

예를 들어, 단순히 문자열을 5번 출력할 때 언더바를 사용할 수 있다. 
for _ in range(5):
	print("Hello World")
'''

특정 크기의 2차원 리스트를 초기화할 땐 반드시 리스트 컴프리헨션을 이용해야 한다.

아래와 같은 방법으로  N × M 크기의 2차원 리스트를 초기화한다면 의도치 않은 결과가 나올 수 있다.

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

위와 같은 결과가 나오는 이유는 내부적으로 포함된 3개의 리스트가 모두 동일한 객체에 대한 3개의 레퍼런스로 인식되기 때문이다.

리스트 관련 기타 메서드

메서드명 사용법 설명 시간 복잡도
append() 변수명.append() 리스트에 원소 하나 삽입 O(1)
sort() 변수명.sort()
변수명.sort(reverse = True)
오름차순 정렬 (default)
내림차순 정렬
O(NlogN)
reverse() 변수명.reverse() 리스트의 원소 순서 모두 뒤집기 O(N)
insert() 변수명.insert(삽입할 위치 인덱스, 삽입할 값) 특정 인덱스 위치에 원소 삽입 O(N)
count() 변수명.count(특정 값) 리스트에서 특정한 값을 가지는 원소 개수 세기 O(N)
remove() 변수명.remove(특정 값) 리스트에서 특정한 값을 가지는 원소 제거.
특정 값을 가지는 원소가 여러 개일 경우 하나만 제거.
O(N)
index() 변수명.index(특정 값) 특정 값의 인덱스 값 반환. 중복되는 값이 있으면 가장 최소의 위치(= 가장 작은 인덱스값)를 반환. O(N)
a = [1, 4, 3]
print("기본 리스트 : ", a)	# 기본 리스트 : [1, 4, 3]

# 리스트에 원소 삽입
a.append(2)
print("삽입 : ", a)	# 삽입 : [1, 4, 3, 2]

# 오름차순 정렬
a.sort()
print("오름차순 정렬 : ", a)	# 오름차순 정렬 : [1, 2, 3, 4]

# 내림차순 정렬
a.sort(reverse = True)
print("내림차순 정렬 : ", a)	# 내림차순 정렬 : [4, 3, 2, 1]

# 리스트 원소 뒤집기
a.reverse()
print("원소 뒤집기 : ", a)	# 원소 뒤집기 : [1, 2, 3, 4]

# 특정 인덱스에 데이터 추가
a.insert(1, 3)
print("인덱스 1에 3 추가 : ", a)	# 인덱스 1에 3 추가 : [1, 3, 2, 3, 4]

# 특정 값인 데이터 개수 세기
print("값이 3인 데이터 개수 : ", a.count(3))	# 값이 3인 데이터 개수 : 2

# 특정 값인 데이터 삭제
a.remove(3)	# 값이 3인 데이터가 여러 개일 경우 맨 처음 만나는 데이터만 삭제
print("값이 3인 데이터 중 맨 앞의 데이터 삭제 : ", a)
# 값이 3인 데이터 중 맨 앞의 데이터 삭제 : [1, 2, 3, 4]

# 특정 값인 데이터 모두 삭제
b = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}
result = [i for i in a if i not in remove_set]	# 리스트 컴프리헨션
print(result)	# [1, 2, 4]

append() 함수는 O(1)에 수행되는 데에 반해 insert() 함수를 사용하면 원소의 개수가 N개일 때 시간 복잡도가 O(N)이다.

insert() 함수를 사용하면 중간에 원소를 삽입한 후 리스트의 원소 위치를 조정해주어야 하기 때문에 동작이 느리다.

insert() 함수와 마찬가지로 remove() 함수의 시간 복잡도 또한 O(N)이다.
리스트에서 중간에 있는 원소를 삭제한 후 리스트의 원소 위치를 조정해주어야 하기 때문이다.

+) 시간 복잡도란?

2023.10.01 - [Algorithm & Data structure/이론] - 복잡도 Complexity : 시간 복잡도 Time Complexity, 공간 복잡도 Space Complexity

 

복잡도 Complexity : 시간 복잡도 Time Complexity, 공간 복잡도 Space Complexity

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 저 Chapter 1 - 3. 복잡도 정리 내용 복잡도는 알고리즘의 성능을 나타내는 척도로, 시간 복잡도와 공간 복잡도로 나눌 수 있다. 시간 복잡도

hyrmzz1.tistory.com

Comments