컬렉션 타입
여러 개의 데이터 항목을 하나의 단위로 관리할 수 있게 해주는 데이터 구조를 의미합니다. 이것은 여러 개의 데이터를 하나의 변수에 저장하고, 관리할 수 있게 해줍니다. 파이썬에서는 리스트, 튜플, 세트, 딕셔너리 등이 기본적인 컬렉션 타입에 속합니다.
1. 리스트
여러 값들을 하나의 변수에 저장하고 관리할 수 있게 해주는 순차적인 자료구조입니다. 대괄호 [ ]를 사용하여 생성하며, 내부에 포함된 각 항목들은 쉼표로 구분됩니다.
li1 = [1, 2, '파이썬', ['김사과', '오렌지']]
li2 = ['김사과', '오렌지', '반하나', ['🍔','🍟','🌭','🍕']]
위의 리스트 처럼 각자 타입이 다른 데이터를 저장할 수 있으며 리스트 안의 요소로 또 리스트가 들어갈 수도 있습니다.
(1)인덱싱
리스트의 각 항목은 위치(인덱스)를 가지고 있으며, 인덱스를 사용하여 접근할 수 있습니다. 인덱스는 0부터 시작합니다.
print(li2[0]) >> '김사과'
print(li2[-1]) >> ['🍔', '🍟', '🌭', '🍕']
print(li2[-1][1]) >> 🍟
(2)슬라이싱
리스트의 일부분만을 추출할 수 있습니다.
li3 = [10, 20, 30, ['김사과', '오렌지', '반하나'],40, ['🍔','🍟']]
print(li3[2:6]) >>[30, ['김사과', '오렌지', '반하나'], 40, ['🍔', '🍟']]
print(li3[5][:1]) >>['🍔']
(3)변경
리스트의 항목들은 변경할 수 있습니다. 즉, 리스트의 항목들을 수정, 추가, 삭제할 수 있습니다.
li1 = [10, 20, 30]
li1[1] = 100
print(li1) >>[10, 100, 30]
li1= [10,20,30]
li2= [40,50,60]
print(li1 + li2) >>[10, 20, 30, 40, 50, 60]
print(li2 + li1) >>[40, 50, 60, 10, 20, 30]
li1 = li1 + [40, 50] # li1 += [40,50]
print(li1) >>[10, 20, 30, 40, 50]
li2 = [10,20,30]
print( li2[0] + li2[2] ) >>40
# 같은 int 타입이기 때문에 덧셈 가능
# 슬라이싱을 이용하여 리스트 데이터를 추가한 경우 리스트에 데이터만 포함
li2 = [100, 20, 30, 40, 50]
li2[1:2]= ['😀','😎','😋']
print(li2) >> [100, '😀', '😎', '😋', 30, 40, 50]
# 인덱싱을 이용하여 리스트 데이터를 추가한 경우 리스트 안에 리스트를 포함
li2 = [100, 20, 30, 40, 50]
li2[1]= ['😀','😎','😋']
print(li2) >>[100, ['😀', '😎', '😋'], 30, 40, 50]
# 삭제하는 방법 : 빈 리스트 이용, del 메소드 이용
li2 = [100, 20, 30, 40, 50]
li2[1:3] = [] # 빈 리스트를 저장하면 요소가 삭제됨
print(li2) >>[100, 40, 50]
li2 = [100, 20, 30, 40, 50]
del li2[2]
print(li2) >>[100, 20, 40, 50]
(4) 여러 함수와 메소드
# len(): 객체의 길이(항목의 개수)를 반환하는 내장 함수
li1= [10,20,30]
print(len(li1)) >> 3
# append(): 리스트에 사용되며, 리스트의 끝에 새로운 항목을 하나만 추가하는 메서드.
li1 = [10, 20, 30]
li1.append(100)
print( li1) >>[10, 20, 30, 100]
li1.append([200,300])
# 여러 항목 추가는 불가하기 때문에 li1.append(200,300)는 에러남. [200, 300]이라는 리스트 요소 한개 추가는 가능.
print( li1) >>[10, 20, 30, 100, [200, 300]]
# extend(): 리스트에 iterable(반복 가능한 객체)의 모든 항목을 추가하는 메서드.(여러 항목 추가 가능)
li1 = [10, 20, 30]
li1.extend([1000,2000]) # 리스트 형식으로 넣어야 함.
print(li1) >>[10, 20, 30, 1000, 2000]
# pop(): 리스트에서 항목을 삭제하고, 삭제된 항목을 반환(리턴값 저장)하는 메서드. in-place 연산.
li1 = [10, 20, 30, 40, 50]
print(li1.pop()) >>50 # 50 삭제를 하고 재저장까지 완료됨. in-place 연산
print(li1) >> [10, 20, 30, 40]
# insert(): 리스트의 특정 인덱스에 항목을 추가하는 메소드. (수정이 아닌 삽입)
li1.insert(1,100) # 인덱스 1번 위치에 100을 삽입.
print(li1) >> [ 10, 100, 20, 30]
# index(): 리스트에서 특정 값의 인덱스를 반환하는 메서드. 특정 값의 인덱스가 없다면 에러발생
li1 = [10, 100, 20, 30]
print(li1.index(100)) >> 1
# print( li1.index(50)) #ValueError: 50 is not in list
# reverse(): 리스트의 항목들의 순서를 뒤집는 메서드. in-place 메서드
li1 = [100, 50, 70, 60, 20]
li1.reverse() # in-place 메서드
print(li1) >>[20, 60, 70, 50, 100]
# 슬라이싱을 사용하여 리스트의 순서를 뒤집는 방법
슬라이싱의 기본 구조는 [start:stop:step]
li1 = ['Apple', 'apple','orange','banana','melon']
print( li1[ : : -1]) >> ['melon', 'banana', 'orange', 'apple', 'Apple']
# start를 생략하면, step이 양수이면 0, step이 음수이면 -1로 간주됩니다.
# stop을 생략하면, step이 양수이면 시퀀스의 끝, step이 음수이면 시퀀스의 시작으로 간주됩니다.
# step을 생략하면 1로 간주
# = print( li1[-1,0,-1])
# sort(): 리스트의 항목들을 오름차순으로 정렬하는 메서드. in-place 연산을 수행
li1 = [10, 40, 30, 100, 90, 50]
li1.sort()
print(li1) >>[10, 30, 40, 50, 90, 100]
li1.sort(reverse = True) # 내림차순
print(li1) >>[100, 90, 50, 40, 30, 10]
# 한글과 영어도 유니코드 기준으로 오름차순, 내림차순이 가능하다
li2 = ['Apple', 'apple','orange','banana','melon']
li2.sort()
print(li2) >> ['Apple', 'apple', 'banana', 'melon', 'orange']
li3 = ['김사과', '오렌지','반하나','이메론','배애리']
li3.sort()
print(li3) >>['김사과', '반하나', '배애리', '오렌지', '이메론']
***sorted(): iterable(반복 가능한 객체)의 모든 항목들을 정렬한 후, 그 결과를 새로운 리스트에 담아 반환하는 함수
in-place 연산이 아니기때문에 피연산자가 수정+저장되는 것이 아니다.
li1 = [10, 40, 30, 100, 90, 50]
print(sorted(li1)) >>[10, 30, 40, 50, 90, 100] # in-place 연산이 아님
print(li1) >>[10, 40, 30, 100, 90, 50] # 오름차순 저장이 안된 상태
print(sorted(li1, reverse=True)) >> [100, 90, 50, 40, 30, 10] # 내림차순
print(li1) >>[10, 40, 30, 100, 90, 50]
# count(): 리스트에서 특정 값의 개수를 반환하는 메서드
li1 = [10, 20, 30, 50, 20, 40, 30, 20]
print(li1.count(20)) >> 3
print(li1.count(16)) >> 0 # 값이 없어도 에러가 나지 않고 0으로 결과 표출.
*** in-place 연산이란?
'바꿔치기 연산'이라고도 하며 연산 결과를 피연산자에 바로 저장한다.