자료구조 - 리스트
⚠️장문주의⚠️
자료구조 : 데이터를 구조화할 때 사용하며, 파이썬의 자료구조는 리스트(list), 튜플(tuple), 딕셔너리(dictionary)가 있다.
리스트
리스트(list) : 여러개의 값을 담을 수 있는 변수
- 리스트 아이템은 문자열, 정수, 실수, boolean형 등 모두 가능하다.
- 리스트 아이템 간에는 순서가 존재한다. (=> 시퀀스 데이터) ⭐
- 리스트 아이템은 index로 순서를 정하고 index는 0번부터 시작한다.
리스트 생성법
1. 대괄호 이용⭐
리스트명 = [리스트아이템1, 리스트아이템2, ... ]
2. 비어있는 리스트 생성 (list() 함수 이용)
<리스트를 담을 변수> = list()
2번 방법은 리스트를 생성할 수 있지만, 비어있는 리스트를 생성한다.
list1 = ["Mon", "Tue", "Wed", "Thu","Fri"]
list2 = [] # 빈 리스트 생성
list3 = list() # 빈 리스트 생성
리스트의 덧셈, 곱셈
- 리스트의 덧셈 (리스트끼리) : 리스트를 이어 붙인다.
- 리스트의 곱셈 (리스트 * 숫자 ): 리스트를 숫자만큼 반복해서 만든다. (0을 곱하면 빈 리스트)
list1 = ['python',3]
list2 = [1, 4, 9, 16]
print(list1 + list2) # 결과 : ['python', 3, 1, 4, 9, 16]
list3 = [1, 2, 3]
list4 = list3 * 3
list5 = list3 * 0
print(list4) # 결과 : [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(list5) # 결과 : []
리스트 인덱싱
리스트는 시퀀스 데이터 타입이라 인덱스를 이용하여 리스트 안에 아이템을 검색하고 리스트 값을 수정할 수 있다.
길이가 n인 리스트에서 인덱스 범위는 양수로 0 ~ n-1, 음수로 -n ~ -1 이다.
길이가 n인 리스트에서..
- 첫번째 값 : <리스트명>[0] = <리스트명>[-n]
- 두번째 값 : <리스트명>[1] = <리스트명>[-n + 1]
.
.
- 뒤에서 두번째 값(n-1번째 값) : <리스트명>[n-2] = <리스트명>[-2]
- 뒤에서 첫번째 값 (n번째 값) : <리스트명>[n-1] = <리스트명>[-1]
예제)
list1 = [111, 222, 333]
print(list1) # 결과 : [111, 222, 333]
list1[0] = 000 # 리스트 인덱싱 => 접근, 수정
print(list1) # 결과 : [000, 222, 333]
list1[-1] = 444
print(list1) # 결과 : [000, 222, 444]
리스트 슬라이싱
<리스트명>[ 시작index : 끝index + 1 : step ] (시작index, 끝index 모두 생략가능)
리스트 슬라이싱(list slicing)은 리스트를 잘라버린다는 것이다. 인덱싱을 이용해서 리스트에서 필요한 부분만 잘라서 쓰는 경우에 사용한다. 클론 : 을 이용해서 원하는 부분을 자른다. ( 예제 꼭 보기!! ⭐)
a = [111, 222, 333, 444, 555, 666, 777, 888] # 길이가 8인 리스트
print(a[1:3]) # 인덱스 1 ~ 2 [222, 333]
print(a[2:8]) # 인덱스 2 ~ 7(끝) [333, 444, 555, 666, 777, 888]
# 끝까지 자를거면 : 뒤에 생략
print(a[1:]) # 인덱스 1 ~ 끝 [333, 444, 555, 666, 777, 888]
# 처음부터 원하는 부분까지 자를거면 : 앞에 생략
print(a[:3]) # 처음부터 ~ 인덱스 2 [111, 222, 333]
print(a[:8]) # 처음부터 ~ 인덱스 7(끝) [111, 222, 333, 444, 555, 666, 777, 888]
# 리스트 전체(처음 ~ 끝)를 자른다면 : 양쪽을 모두 생략
print(a[:]) # 처음 ~ 끝 [111, 222, 333, 444, 555, 666, 777, 888]
# 마이너스 인덱스 이용
print(a[-2 : ]) # 마지막에서 2번째 ~ 끝 [777, 888]
print(a[-1 : ]) # 마지막에서 1번째(끝) ~ 끝 [888]
print(a[-5 : -2]) # 마지막에서 5번째 ~ 마지막에서 2번째 [444, 555, 666]
print(a[:-5]) # 처음 ~ 마지막에서 5번째 [111, 222, 333]
리스트 슬라이싱 응용
리스트 슬라이싱을 이용해서 reverse도 가능하고, 리스트 범위 삭제, 수정, 추가 가능하다.
1. 삭제 : del <리스트명>[ 슬라이싱 범위 ]
2. 수정 : <리스트명>[ 슬라이싱 범위 ] = [수정한 값들]
- list[ 1 : 3 ] = [ 77, 88 ] 과 같이 동일한 개수로 수정, 반환
- list[ 1 : 3 ] = [ 77, 88, 99 ] 과 같이 더 많은 개수로 수정, 반환
- list[ 1 : 3 ] = [ 8 ] 과 같이 더 적은 개수로 수정, 반환
3. 뒤집기 (reverse) : <리스트명> [슬라이싱 범위를 음수로]
list1 = [0, 1, 2, 3, 4, 5]
list1[1:4] = [11, 22, 33] # 인덱스 1~3의 값 수정
print(list1)
list2 = list1[:] # list1을 list2에 복사한 개념
del list2[1:4]
print(list2)
list3 = list(range(20)) # 0~19의 리스트
list4 = list3[5:15:3] #step을 이용하여 슬라이싱
print(list4)
list5 = list3[-3:-16:-4] # 역으로 뒤집어서 슬라이싱 (reverse)
print(list5)
리스트 수정 (with 리스트의 대표적인 메서드)
[참고] (메서드란 2023.02.17 - [Python] - [Python] 함수 글에서 [참고] )
1. 리스트의 길이 구하기
: 함수 len( <리스트명> ) 이용
2. 리스트에 값 추가
: 리스트에 값을 추가하는 방법은 총 3가지가 있다.
- 리스트 메서드 list.append( a ) 이용 (리스트의 인덱스 끝에 새로운 값(a)을 추가)
- 리스트 + 연산자 이용 (리스트 뒤에 새로운 리스트를 더하기)
- 리스트 메서드 list.insert( a, b ) 이용 (특정 위치(a)에 값(b) 추가)
* 리스트 메서드를 이용하면 해당 리스트에 값을 추가하고, + 연산자는 새로운 리스트에 기존 리스트와 추가할 리스트를 더하는 것!
3. 리스트에서 값 삭제
: 리스트에서 필요없는 값을 삭제하는 방법은 총 2가지가 있다.
- 함수 del(리스트 범위(슬라이싱) or 특정 인덱스) 이용 : del( <리스트명>[범위] ) / del( <리스트명>[인덱스])
- 리스트 메서드 list.remove( a ) 이용 (특정 인덱스(a)의 값 제거)
*remove 메서드에서 리스트에 중복된 값 x 를 삭제한다면, 맨 처음 x를 삭제한다. 또한 없는 값을 삭제하려 한다면 에러가 발생한다.
4. 그 외 (리스트 메서드 이용)
- list.count( a ) 이용해서 리스트 값 x의 개수 세기 (값 x가 리스트에 몇개 들었는지 반환)
- list.copy() 이용해서 리스트 복사 (해당 리스트 복사 후 반환)
- list.reverse() 이용해서 리스트 뒤집기
- list.sort() 이용해서 리스트 오름차순 정렬 (주의!! 내부 요소의 데이터 타입이 같아야 함.)
- list.index( a ) 이용해서 리스트 값 ( a )의 인덱스 값을 반환
- list.clear() 이용해서 리스트에 저장된 모든 값 삭제
- list.extend ( list2 ) 이용해서 리스트를 다른 리스트 list2에 연결 (매개변수가 무조건 리스트여야 함.)
list = [1, 2, 3, 4, 5]
print(len(list)) # 리스트 길이 구하기
list.append(6) # 값 추가 append
print(list) # [1, 2, 3, 4, 5, 6]
list.insert(0, 0) # 값 추가 insert(a,b) 인덱스 0 에 값 0 추가
print(list) # [0, 1, 2, 3, 4, 5, 6]
list2 = list + ["추가"] # + 연산자로 값 추가
print(list2) # [0, 1, 2, 3, 4, 5, 6, "추가"]
del(list[0]) # 함수 del : 특정위치 값 삭제
print(list) # [1, 2, 3, 4, 5, 6]
del(list[3:]) # 함수 del : 범위만큼 값 삭제 (인덱스 3 ~ 끝 삭제)
print(list) # [1, 2, 3]
list.remove(3) # remove 메서드 : 리스트 값 3 삭제
print(list) # [1, 2]
list. remove(100) # 만약 없는 값을 삭제하려 한다면 오류!!
리스트에 값이 들어있는지 확인하기
for 문을 이용해서 리스트를 전체 순환하면서 in 연산을 이용함 (True / False로 반환)
<묻는 값> in <물어볼 리스트명>
#12라는 값이 리스트에 들어있는지 확인하는 코드
n=12
if n in list1:
print('{}가 리스트에 있다.'.format(n))
리스트와 문자열
리스트와 문자열은 유사하고, 서로 변환이 가능하다.
- 문자열 -> 리스트 : <자른 문자들을 담을 리스트명> = str.split( <자르는 기준 문자> )
- 리스트 -> 문자열 : <합칠 구분 문자>.join( <자른 문자들 리스트명> )
time_str = "10:35:27"
time_list = time_str.split(":")
print(time_list) # ['10', '35', '27']
return_str = ":".join(time_list)
print(return_str) # 10:35:27
'Python > 파이썬 기초' 카테고리의 다른 글
[Python] 리스트와 딕셔너리 비교 (0) | 2023.02.19 |
---|---|
[Python] 자료구조 2 - 딕셔너리, 튜플 (0) | 2023.02.19 |
[Python] 자료형과 사용자 입력 (0) | 2023.02.17 |
[Python] 함수 (0) | 2023.02.17 |
[Python] 조건문 (0) | 2023.02.16 |