일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- sort()
- ARP
- 기억장치
- 컴퓨터 동작방식
- 쉽게 배우는 데이터 통신과 컴퓨터 네트워크
- 파이썬 자료형
- 자료형
- 쿠키
- icmp
- 파이썬 정렬
- GIT
- 노마드코더
- 북클럽
- data type
- RARP
- 리스트
- DP
- CS
- 이것이 취업을 위한 코딩테스트다
- IT5분잡학사전
- 이코테
- 시스템 소프트웨어
- 라우팅
- 컴퓨터네트워크
- 노개북
- 파이썬 연산자
- 데이터 통신과 컴퓨터 네트워크
- 이것이 취업을 위한 코딩 테스트다
- 데이터통신
- OSI7계층모델
- Today
- Total
뚝딱햄 탈출기
[Python] 리스트 자료형 List data type : 리스트 컴프리헨션, 인덱싱, 슬라이싱, 리스트 연산, 기타 메서드 본문
[Python] 리스트 자료형 List data type : 리스트 컴프리헨션, 인덱싱, 슬라이싱, 리스트 연산, 기타 메서드
hyrmzz1 2023. 10. 1. 05:50이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 저
APPENDIX A. 코딩 테스트를 위한 파이썬 문법 정리 내용
자료형 (데이터 타입, data type) 종류
- 수 (Number)
- 리스트 (List)
- 문자열 (String)
- 튜플 (Tuple)
- 사전 (Dictionary)
- 집합 (Set)
리스트 자료형
여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용한다.
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부터 시작하고, 인덱스값은 양의 정수와 음의 정수를 모두 사용할 수 있다.
음의 정수를 넣으면 원소를 거꾸로 탐색한다.
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)이다.
리스트에서 중간에 있는 원소를 삭제한 후 리스트의 원소 위치를 조정해주어야 하기 때문이다.
+) 시간 복잡도란?
'Programming language > Python' 카테고리의 다른 글
[Python] 연산자 : 비교 연산자, 논리 연산자 (0) | 2023.10.03 |
---|---|
[Python] 반복문 : while문, for문 (0) | 2023.10.02 |
[Python] 조건문 : if elif else 문 (1) | 2023.10.02 |
[Python] 자료형 (데이터 타입, data type) : number, list, string, tuple, dictionary, set (0) | 2023.10.02 |
[Python] 수 자료형 Number data type (0) | 2023.09.30 |