여러 개의 데이터 항목을 하나의 단위로 관리할 수 있게 해주는 데이터 구조를 의미.
이것은 여러 개의 데이터를 하나의 변수에 저장하고, 관리할 수 있게 해준다. ex) 기본적인 컬렉션 타입: 리스트, 튜플, 세트, 딕셔너리 등
여러 값들을 하나의 변수에 저장하고 관리할 수 있게 해주는 순차적인 자료구조
li1 = [1, 3, 5, 7, 9]
print(li1)
print(type(li1))
li2 = list([1, 3, 5, 7, 9])
print(li2)
print(type(li2))
li3 = ['김사과', '반하나', '오렌지', '이메론']
print(li3)
li4 = [1, 50.5, '김사과', True] # 각자 타입이 다른 데이터를 저장
print(li4)
print(type(li4))
print(li4[0])
print(type(li4[0]))
print(li4[0])
print(li4[1])
print(li4[2])
print(li4[3])
# print(li4[4]) # IndexError: list index out of range
print(type(li4[0]))
print(type(li4[1]))
print(type(li4[2]))
print(type(li4[3]))
[1, 3, 5, 7, 9]
<class 'list'>
[1, 3, 5, 7, 9]
<class 'list'>
['김사과', '반하나', '오렌지', '이메론']
[1, 50.5, '김사과', True]
<class 'list'>
1
<class 'int'>
1
50.5
김사과
True
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
li1 = [1, 3, 5, 7, 9]
print(li1)
print(li1[0])
print(li1[-1])
print(li1[0] + li1[-1])
li2 = [1, 2, '파이썬', ['김사과', '오렌지']]
print(li2)
print(type(li2))
print(li2[1])
print(type(li2[1]))
print(li2[3])
print(type(li2[3]))
print(li2[3][1])
print(type(li2[3][1]))
li3 = [1, 2, 3, ['김사과', '오렌지', '반하나', ['🍟','🌭','🥩','🍗']]]
print(li3)
print(li3[2])
print(li3[-1])
print(li3[-1][-2])
print(li3[-1][-1][-2])
print(li3[-1][-1][-1])
[1, 3, 5, 7, 9]
1
9
10
[1, 2, '파이썬', ['김사과', '오렌지']]
<class 'list'>
2
<class 'int'>
['김사과', '오렌지']
<class 'list'>
오렌지
<class 'str'>
[1, 2, 3, ['김사과', '오렌지', '반하나', ['🍟', '🌭', '🥩', '🍗']]]
3
['김사과', '오렌지', '반하나', ['🍟', '🌭', '🥩', '🍗']]
반하나
🥩
🍗
li1 = [10, 20, 30, 40, 50]
print(li1)
print(li1[0:3])
li2 = li1
print(li2)
li2[0] = 100
print(li2)
print(li1)
li3 = [1, 2, 3, ['김사과', '오렌지', '반하나', ['🍟','🌭','🥩','🍗']]]
print(li3[2:3])
print(li3[3][:2])
[10, 20, 30, 40, 50]
[10, 20, 30]
[10, 20, 30, 40, 50]
[100, 20, 30, 40, 50]
[100, 20, 30, 40, 50]
[3]
['김사과', '오렌지']
li4 = [10, 20, 30, 40, 50]
# 슬라이싱을 이용하여 요소를 추가한 경우 리스트에 데이터만 포함
li4[1:2] = ['😁','😂','😎','😍']
print(li4)
li4 = [10, 20, 30, 40, 50]
# 인덱싱을 이용하여 요소를 추가한 경우 리스트 안에 리스트를 만들고 포함
li4[1] = ['😁','😂','😎','😍']
print(li4)
li4 = [10, 20, 30, 40, 50]
print(li4[1:3])
li4[1:3] = [] # 빈 리스트를 슬라이싱을 통해 저장하면 해당 요소가 삭제됨
print(li4)
li4 = [10, 20, 30, 40, 50]
print(li4[1:2])
print(li4[1])
del li4[1]
print(li4)
li4 = [10, 20, 30, 40, 50]
print(li4)
del li4[1]
print(li4)
[10, '😁', '😂', '😎', '😍', 30, 40, 50]
[10, ['😁', '😂', '😎', '😍'], 30, 40, 50]
[20, 30]
[10, 40, 50]
[20]
20
[10, 30, 40, 50]
[10, 20, 30, 40, 50]
[10, 30, 40, 50]
li5 = [10, 20, 30]
li6 = [40, 50, 60]
print(li5 + li6)
print(li6 + li5)
li5 = [10, 20, 30]
li6 = li5 + [40, 50, 60] # [10, 20, 30] + [40, 50, 60]
print(li6)
li6 = [10, 20, 30]
li6 += [40, 50, 60] # li6 = li6 + [40, 50, 60]
print(li6)
li6 = [10, 20, 30]
print(li6 * 3)
[10, 20, 30, 40, 50, 60]
[40, 50, 60, 10, 20, 30]
[10, 20, 30, 40, 50, 60]
[10, 20, 30, 40, 50, 60]
[10, 20, 30, 10, 20, 30, 10, 20, 30]
# len(): 객체의 길이를 반환하는 파이썬의 기본 내장 함수
li6 = [10, 20, 30]
print(len(li6))
3
# append(): 리스트 요소의 끝에 새로운 요소를 추가
li6 = [10, 20, 30]
print(li6)
li6.append(100)
print(li6)
# li6.append(200, 300)
li6.append([200, 300])
print(li6)
[10, 20, 30]
[10, 20, 30, 100]
[10, 20, 30, 100, [200, 300]]
# extend(): 리스트 요소의 끝에 새로운 여러 요소를 추가
li6 = [10, 20, 30]
print(li6)
# li6.extend(100)
li6.extend([100])
print(li6)
li6.extend([200, 300, 400])
print(li6)
[10, 20, 30]
[10, 20, 30, 100]
[10, 20, 30, 100, 200, 300, 400]
# pop(): 리스트 마지막 요소를 삭제하고 삭제된 요소를 반환
li6 = [10, 20, 30]
print(li6)
# print(li6.pop())
temp = li6.pop()
print(li6)
print(temp)
print(li6.pop())
print(li6)
[10, 20, 30]
[10, 20]
30
20
[10]
# index(): 리스트에서 특정 요소의 값 인덱스를 반환
li6 = [10, 20, 30]
print(li6)
print(li6.index(30))
# print(li6.index(100)) # 값이 없으면 에러
[10, 20, 30]
2
# reverse(): 리스트의 요소들의 순서를 반대로 설정
li7 = [100, 50, 70, 60, 20]
print(li7)
li7.reverse()
print(li7)
[100, 50, 70, 60, 20]
[20, 60, 70, 50, 100]
# 슬라이싱을 사용하여 리스트의 요소들의 순서를 반대로 설정하는 방법
li7 = [100, 50, 70, 60, 20]
print(li7[:]) # [0:5]
print(li7[0:5])
print(li7[::]) # step이 생략
print(li7[0:5:1]) # step의 기본값은 1
print(li7[0:5:2]) # step을 2로 설정
li7 = [100, 50, 70, 60, 20]
print(li7[::-1])
# step이 -1일 경우 start의 기본값은 -1, stop의 기본값은 0으로 설정
print(li7[1::-1])
print(li7[:0:-1])
[100, 50, 70, 60, 20]
[100, 50, 70, 60, 20]
[100, 50, 70, 60, 20]
[100, 50, 70, 60, 20]
[100, 70, 20]
[20, 60, 70, 50, 100]
[50, 100]
[20, 60, 70, 50]
# sort(): 리스트의 요소를 오름차순으로 정렬
li7 = [100, 50, 70, 60, 20]
print(li7)
li7.sort()
print(li7)
# sort(reverse=True): 리스트의 요소를 내림차순으로 정렬
li7.sort(reverse=True)
print(li7)
li8 = ['Apple', 'apple', 'orange', 'banana', 'melon']
li8.sort()
print(li8)
li9 = ['김사과', '오렌지', '반하나', '이메론', '배애리']
li9.sort()
print(li9)
[100, 50, 70, 60, 20]
[20, 50, 60, 70, 100]
[100, 70, 60, 50, 20]
['Apple', 'apple', 'banana', 'melon', 'orange']
['김사과', '반하나', '배애리', '오렌지', '이메론']
# sorted(): 모든 요소를 정렬한 후 반환해주는 함수
li7 = [100, 50, 70, 60, 20]
print(li7)
result = sorted(li7)
print(li7)
print(result)
[100, 50, 70, 60, 20]
[100, 50, 70, 60, 20]
[20, 50, 60, 70, 100]
# count(): 리스트에서 특정 요소의 갯수를 반환
li9 = [10, 20, 30, 50, 20, 40, 30, 20]
print(li9)
print(li9.count(20))
print(li9.count(100))
[10, 20, 30, 50, 20, 40, 30, 20]
3
0
✔ 다시 정리해보기!
- 리스트의 각 항목은 위치(인덱스)를 가지고 있고, 인덱스를 사용하여 접근할 수 있다.
- 슬라이싱 : 리스트의 일부분만을 추출할 수 있다. (리스트에서 여러 개 요소를 잘라서 새로운 리스트로 만드는 것)
- ✨ 리스트의 항목들은 변경 가능! (수정, 추가, 삭제 가능)
- 연산 : 리스트 간 + 연산으로 리스트 결합 가능, * 연산으로 리스트 반복 가능
여러 함수, 메소드
- len() : 객체의 길이 반환
- ✨ append() : 리스트 요소의 끝에 새로운 요소 추가. (단, 여러개를 넣을 수 X)
- ✨ extend() : 리스트 요소의 끝에 새로운 여러 요소 추가
- pop() : 리스트 마지막 요소 삭제, 삭제된 요소 반환
- index() : 리스트에서 특정 요소의 값 인덱스 반환
- reverse() : 리스트 요소들의 순서를 반대로 설정
- ✨ sort() : 리스트의 요소를 오름차순으로 정렬
- ✨ sort(reverse=True) : 리스트의 요소를 내림차순으로 정렬
- ✨ sorted() : 모든 요소를 정렬한 후 반환해주는 함수
- count() : 리스트에서 특정 요소의 갯수를 반환
sort()와 sorted()의 차이
항목 list.sort()sorted(list)작동 대상 리스트만 사용 가능 모든 iterable 사용 가능 정렬 방식 리스트 자체를 변경함 새로운 정렬된 리스트 반환 반환값 None 반환 (리스트 자체 변경)정렬된 새 리스트 반환 원본 보존 ❌ 원본 리스트가 바뀜 ✅ 원본은 그대로 유지됨
sort()와 sorted() 중, 언제 어떤 것을 써야 할까...?
상황 추천 함수 원본 리스트를 그대로 두고 싶을 때 sorted()원본 리스트 자체를 정렬해도 상관없을 때 sort()
sort()와 sorted() 공통점 : 둘 다 reverse=True, key=함수 등의 옵션 사용 가능