여러 개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라고 하고, 이러한 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.
ex)
이름A, 이름B, 이름C, 이름D -> 묶어서 관리 = 컨테이너 자료형

Tuple은 한번 정해진 데이터는 변경할 수 없다.
Dictionary는 key와 value로 이루어짐
Set의 특징은 중복된 데이터가 존재할 수 없다.
'[ ]'를 이용해서 선언하고 데이터 구분은 ','를 이용한다.
숫자, 문자(열), 논리형 등 모든 기본 데이터를 같이 저장할 수 있다.
리스트에 또 다른 컨테이너 자료형 데이터를 저장할 수도 있다.
ex) datas = [10, 20, 30, [40, 50, 60]]
인덱스란, 아이템에 자동으로 부여되는 번호표
pocketmon = ['피카츄', '리자몽', '루카리오']
pocketmon[0] -> 피카츄
pocketmon[1] -> 리자몽
pocketmon[2] -> 루카리오
리스트 길이란, 리스트에 저장된 아이템 개수를 뜻한다.
len(pocketmon) -> 3
cf) 여기서 pocketmon이라는 변수를 레퍼런스 변수라고 한다.
cars = ['그렌저', '소나타','말리부', '카니발', '쏘렌토']
for i in range(len(cars)):
    print(cars[i])
for car in cars:
    print(car)

studentsCnts = [[1,19],[2,20],[3,22],[4,18],[5,21]]for i in range(len(studentsCnts)): print('{}학습 학생수: {}'.format(studentsCnts[i][0],studentsCnts[i][1]))위아래 둘다 동일한 방법임.
for classNo, cnt in studentsCnts: print('{}학습 학생수: {}'.format(classNo,cnt))
리스트는 for문이랑 많이 사용하지만 종종 while문이랑도 사용함.

enumerate()는 문자열에도 사용할 수 있다.
문자열에 사용하면 문자 하나하나가 적용된다.

append() 함수를 이용하면 마지막 인덱스에 아이템을 추가할 수 있다.
insert() 함수를 이용하면 특정 위치(인덱스)에 아이템을 추가할 수 있다.
insert(인덱스, 데이터)
ex)
pocketmon = ['피카츄', '리자몽', '팬텀','망나뇽']
pocketmon.insert(3,'루기아')
print(pocketmon)
#결과 ['피카츄', '리자몽', '팬텀', '루기아', '망나뇽']
pop() 함수를 이용하면 마지막 인덱스에 해당하는 아이템을 삭제할 수 있다.
pop(n): n인덱스에 해당하는 아이템을 삭제할 수 있다.
ex)
sports = ['농구', '축구', '마라톤', '테니스']
sports.pop()
print(sports)
#결과 -> ['농구', '축구', '마라톤']
sports = ['농구', '축구', '마라톤', '테니스']
sports.pop(2)
print(sports)
#결과 -> ['농구', '축구', '테니스']
sports = ['농구', '축구', '마라톤', '테니스']
value = sports.pop(2)
print(value)
#결과 -> 마라톤
remove()함수를 이용하면 특정 아이템을 삭제할 수 있다.
ex) remove('축구')
remove()는 한 개의 아이템만 삭제 가능하다. 만약 삭제하려는 데이터가 2개 이상이라면 while문을 이용하자.
while '삭제 대상' in 리스트:
ex)
sports = ['농구', '축구', '마라톤', '축구','테니스']
print(sports)
#sports라는 리스트 안에 '축구'가 있으면 True
while '축구' in sports:
    sports.remove('축구')
print(sports)
extend() 함수를 이용하면 리스트에 또 다른 리스트를 연결(확장)할 수 있다.
앞에 리스트에 뒤에 리스트가 연결되는 것.

덧셈 연산자를 이용해서 리스트를 연결할 수도 있다.
새로운 리스트가 생성되는 것

group1 = ['축구', '농구', '야구'] group2 = ['마라톤', '유도', '레슬링'] print('group1: {}'.format(group1)) print('group2: {}'.format(group2))group1.extend(group2) print('group1: {}'.format(group1)) print('group2: {}'.format(group2)) # #group1: ['축구', '농구', '야구', '마라톤', '유도', '레슬링'] #group2: ['마라톤', '유도', '레슬링']result = group1 + group2 print('result: {}'.format(result)) print('group1: {}'.format(group1)) print('group2: {}'.format(group2)) # #result: ['축구', '농구', '야구', '마라톤', '유도', '레슬링'] #group1: ['축구', '농구', '야구'] #group2: ['마라톤', '유도', '레슬링']
reverse() 함수를 이용하면 아이템 순서를 뒤집을 수 있다.
ex) 리스트.reverse()
[n:m]을 이용하면 리스트에서 원하는 아이템만 뽑아낼 수 있다.

ex)
students = ['홍길동', '박찬호', '이용규', '강호동', '손흥민','김연아']
print('students: {}'.format(students))
print('students: {}'.format(students[2:4]))


문자열도 슬라이싱 할 수 있음.
리스트 방식과 똑같음.

[2:-2:2]는 인덱스 2부터 뒤에서 2번째 인덱스 앞까지 가져오는데 전부 가져오는 것이 아니라 2칸씩 해당하는 것을 가져옴
[:-2:2]는 앞에서부터 뒤에서 2번째 인덱스 앞까지 가져오는데 2칸씩 해당하는 것을 가져옴

개수 다르게 입력하면 그만큼만 추가됨
slice() 함수를 이용해서 아이템을 슬라이싱 할 수 있다.
일반 슬라이싱 방식이랑 똑같음.
ex) students[slice(2,4)]
리스트를 곱셈 연산하면 아이템이 반복된다.
students = ['홍길동', '박찬호', '이용규']
studentsMul = students * 2
print(studentsMul)
-> ['홍길동', '박찬호', '이용규', '홍길동', '박찬호', '이용규']
count() 함수를 이용하면 특정 아이템의 개수를 알아낼 수 있다.
ex)
count('피카츄')
todayData.count('피카츄')
del 키워드를 이용하면 특정 아이템을 삭제할 수 있다.
ex)
del students[1] -> 인덱스 1 아이템 삭제
del students[1:4] -> 인덱스 1에서부터 인덱스 4 앞의 아이템까지 삭제