1. 리스트 자료형
- 리스트는 여러 값을 묶어서 갖는 커네이너 자료형 중 하나
- 대괄호 [] 안에 콤마로 구분해 값을 나열, 이 값을 요소라고 부름
- 숫자, 문자, 파일, 이미지 등등 모두가 리스트의 요소가 될 수 있음
1) 일반 변수와 리스트 비교
- 일반 변수를 사용하면 5명 학생 성적을 처리하기 위해 5개의 변수가 필요 → 하지만 리스트는 학생 성적을 리스트 하나로 처리할 수 있음
- sum() , max() 함수로 합이나 최댓값을 쉽게 구할 수 있음
# 개별 값을 갖는 기존 변수
score1 = 85
score2 = 90
score3 = 80
score4 = 75
score5 = 95
# 하나의 리스트로 5개의 값을 한 번에 처리
score = [85, 90, 80, 75, 95]
2) 리스트 만들기
a. 비어있는 리스트 만들기
score1 = []
score2 = list()
b. 같은 자료형을 요소로 갖는 리스트
- len() 함수로 리스트 요소 개수를 확인 할 수 있음
score = [85, 95, 90, 75]
c. 여러 자료형을 요소로 갖는 리스트
member = ['Hong', 85, 'Han', 95, 'Park', 75]
d. 리스트를 요소로 갖는 리스트
score = [[80, 90, 75], [85, 70, 99], [90, 75, 80]]
e. range() 함수로 리스트 만들기
- 연속된 정수로 리스트를 만들 때는 range() 함수를 이용하면 편리
range(n)
: 0부터 n-1 까지의 정수 범위
range(m, n)
: m부터 n-1 까지의 정수 범위
range(m, n, x)
: m부터 n-1까지 x만큼씩 증가하는 정수
f. 문자열로 리스트 만들기
list_str = ['PYTHON']
: 결과는 [’P’, ‘Y’, ‘T’, ‘H’, ‘O’, ‘N’]
3) 리스트 인덱싱
- 리스트 안에서 특정 값(요소)을 찾을 때 사용하는 데이터를 인덱스 라고 함
- 이러한 인덱스로 특정 요소를 찾는 과정이 인덱싱
- 대괄호 [] 안에 인덱스를 지정
- 인덱스는 0부터 시작. 단, 역방향은 -1부터 시작
member = ['홍길동', 85, '한사랑', 95, '일지매', 90, '박여인', 75]
# 인덱싱
print(member[4]) # 결과 : 일지매
print(member[7]) # 결과 : 75
# 리스트를 요소로 갖는 리스트
score = [80, [90, 100, 85], 85, 90]
# 인덱싱
print(score[2]) # 결과 : 85
print(score[1]) # 결과 : [90, 100, 85]
print(score[1][1]) # 결과 : 100
4) 리스트 슬라이싱
- 인덱스를 사용해 특정 범위의 요소를 찾는 과정이 슬라이싱
- [m:n] 형태로 범위를 지정하여 요소를 확인 : m부터 n-1까지
member = ['홍길동', 85, '한사랑', 95, '일지매', 90,' 박여인', 75]
# [::-1] = 뒤에서부터 읽기
# [::2] = 한 칸 띄면서 읽기
print(member[:2]) # 결과 : ['홍길동', 85]
print(member[4:]) # 결과 : ['일지매', 90, ' 박여인', 75]
print(member[:]) # 결과 : 리스트 전체
print(member[3::-1]) # 결과 : 3부터 뒤에서부터 읽기
# [95, '한사랑', 85, '홍길동']
# 리스트를 요소로 갖는 리스트
score = [80, [90, 100, 85], 85, 90]
# 슬라이싱
print(score[1][1:]) # 결과 : [100, 85]
5) 리스트 연산 : 문자열 연산과 같은 결과
- 0을 곱하면 빈 리스트가 된다!
score1 = [90, 80, 95, 70]
score2 = [70, 75, 90, 100]
score3 = score1 + score2
score3 # 결과 : [90, 80, 95, 70, 70, 75, 90, 100]
score1 = [90, 80, 95, 70]
score2 = score1 * 2
score2 # 결과 : [90, 80, 95, 70, 90, 80, 95, 70]
6) 요소 변경, 추가, 삭제
a. 변경
- 범위 내 변경 : 기존 요소의 값이 변경
nums = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
nums[1] = 10 # [0, 10, 2, 3, 4, 5, 6, 7, 8, 9]
nums[2:4] = [20, 30] # [0, 10, 20, 30, 4, 5, 6, 7, 8, 9]
# 4,5,6 인덱스의 값을 40, 50으로 바꿔라 즉, 6은 사라짐
nums[4:7] = [40, 50] # [0, 10, 20, 30, 40, 50, 7, 8, 9]
- 범위 밖 변경 : 범위를 벗어나는 요소 값을 변경하면 요소가 추가 됨
# 현재 6,7,8 인덱스 값은 7,8,9
# 9 인덱스에는 값이 없음 추가됨
nums[6:] = [70, 80, 90, 100] # [0, 10, 20, 30, 40, 50, 70, 80, 90, 100]
# 범위를 완전히 벗어나는 요소 값 변경
nums[600:] = [110, 120] # [0, 10, 20, 30, 40, 50, 70, 80, 90, 100, 110, 120]
b. 추가
- append() : 맨 뒤에 요소 하나를 추가 → 리스트 메소드는 바로 적용이 가능하다! 즉, 새로운 변수로 선언할 필요X
nums = list(range(5)) # [0, 1, 2, 3, 4]
# 맨 뒤에 요소 하나 추가
nums = nums + [5] # [0, 1, 2, 3, 4, 5]
nums.append(6) # [0, 1, 2, 3, 4, 5, 6]
nums.append([7, 8]) # [0, 1, 2, 3, 4, 5, 6, [7, 8]]
- insert() : 중간에 요소 추가
nums = [10, 20, 40, 50]
# 특정 위치에 요소 추가
nums.insert(2, 30) # [10, 20, 30, 40, 50]
- 뒤에 리스트 붙이기 → 리스트 + 리스트 하면 리스트가 연결 → extend() : 리스트 뒤에 리스트를 붙이는 메소드
nums = [0, 1, 2, 3, 4]
#리스트 더하기
nums = nums + [5, 6, 7, 8, 9] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
nums.extend([5, 6, 7, 8, 9]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9]
c. 삭제
- del 다음에 인덱싱/슬라이싱 구문을 추가해 해당 요소를 삭제
- []를 대입하거나 clear() 메소드로 초기화
nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]
# 요소 하나 삭제
del nums[7] # [10, 20, 30, 40, 50, 60, 70, 90]
# 범위 삭제
del nums[4:] # [10, 20, 30, 40]
# 전체 삭제
nums = []
nums.clear()
7) 리스트 복사
- 변수 = 리스트 형태는 우리가 생각하는 복사가 아님
- 범위를 지정한 복사, copy()를 통한 복사가 진짜 복사→ 이유 : 원본이든 복사본이든 한 쪽 변경이 다른 쪽에 영향을 준다면 완전한 복사가 아님
nums = list(range(10))
nums_copy_1 = nums # 그냥 복사
nums_copy_2 = nums[:] # 전체 범위를 지정하여 복사
# 확인
print(nums_copy_1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums_copy_2) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# copy_1의 첫번째 값 변경 후 원본과 비교
nums_copy_1[0] = 'a'
# 확인
print(nums_copy_1) # ['a', 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums_copy_2) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums) # ['a', 1, 2, 3, 4, 5, 6, 7, 8, 9]
8) 리스트 관련 메소드
- 문자열 관련 메소드에 의한 변경은 변수에 바로 반영되지 않는다.
- 하지만 리스트 관련 메소드에 의한 변경은 변수에 바로 반영
a = 'I have a Dream.'
b = ['A', 'B', 'C', 'D']
# 메소드 사용
a.upper()
b.reverse()
# 확인
print(a) # I have a Dream.
print(b) # ['D', 'C', 'B', 'A']
- count(x) : 리스트 안 x 요소 개수
- index(x) : x 요소가 처음 나타나는 위치
- reverse() : 리스트 안 요소 순서를 내림차순 정렬
- sort() : 리스트 안 요소 순서를 오름차순 정렬
- remove(x) : 리스트 안 x 요소 삭제 (하나!)
- pop(n) : 리스트 안 n 인덱스 요소 삭제 후 삭제 요소 반환