1. 컬렉션 타입
여러 개의 데이터 항목을 하나의 단위로 관리할 수 있게 해주는 데이터 구조를 의미한다. 이것은 여러 개의 데이터를 하나의 변수에 저장하고, 관리할 수 있게. 해준다 기본적인 컬렉션 타입에는 리스트, 튜플, 세트, 딕셔너리 등이 있다.
2.리스트
여러 값들을 하나의 변수에 저장하고 관리할 수 있게 해주는 순차적인 자료구조다.
2-1. 리스트사용
li1 = [1, 3, 5, 7, 9]
print(li1)
print(type(li1))
결과:
[1, 3, 5, 7, 9]
<class 'list'>
li2 = list([1, 3, 5, 7, 9,])
print(li2)
print(type(li2))
결과:
[1, 3, 5, 7, 9]
<class 'list'>
위의 두가지 코드는 같은결과가 나온다.
둘의 결과가 같지만 아래의 코드는 다른 자료구조를 아래의 코드와 같이 리스트로 감싸면 리스트 형태로 변하게 된다.
그래서 다른 자료 구조를 리스트로 바꾸거나 리스트를 다른 자료 구조로 바꿀때 많이 사용된다.
li3 = ['김사과', '반하나', '오렌지', '이메론']
print(li3)
결과:
['김사과', '반하나', '오렌지', '이메론']
li4 = [1, 50.5, '김사과', True]
print(li4)
결과:
[1, 50.5, '김사과', True]
print(li4[0])
print(type(li4[0]))
print(type(li4[1]))
print(type(li4[2]))
print(type(li4[3]))
결과:
1
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
리스트는 위와 같이 여러가지 데이터 타입을 함께 담을수있다.
2-2. 연산
li1 = [1, 3, 5, 7, 9]
print(li1)
print(li1[0])
print(li1[-1])
print(li1[0] + li1[-1])
결과:
[1, 3, 5, 7, 9]
1
9
10
리스트에 담겨있는 값끼리 연산이 가능하다.
li2 = [1, 2, '파이썬', ['김사과', '오렌지']]
print(li2)
print(type(li2))
print(li2[0])
print(type(li2[0]))
print(li2[3])
print(type(li2[3]))
print(li2[3][0])
print(type(li2[3][0]))
결과:
[1, 2, '파이썬', ['김사과', '오렌지']]
<class 'list'>
1
<class 'int'>
['김사과', '오렌지']
<class 'list'>
김사과
<class 'str'>
리스트 안에 리스트를 담는 것도 가능하다.
li3 = [1, 2, 3, ['김사과', '오렌지', '반하나', ['🎉','🎂','🐱👤','🐱💻']]]
print(li3[2])
print(li3[-1])
print(li3[-1][-2])
print(li3[-1][-1][-1])
결과:
3
['김사과', '오렌지', '반하나', ['🎉', '🎂', '🐱👤', '🐱💻']]
반하나
🐱💻
2-3.리스트 슬라이싱
li1 = [10, 20, 30, 40, 50]
print(li1)
print(li1[0:3])
결과:
[10, 20, 30, 40, 50]
[10, 20, 30]
li2 = li1
print(li2)
li2[0] = 100
print(li2)
print(li1)
결과:
[10, 20, 30, 40, 50]
[100, 20, 30, 40, 50]
[100, 20, 30, 40, 50]
li2 의 값은 li1 의 값을 가리키고 있기 때문에 li2에서 값을 변경하면 li1 에서도 같이 변경이 된다.
li3 = [10, 20, 30, ['김사과', '오렌지', '반하나'],40,['🐱','😃']]
print(li3[2:6])
print(li3[5][:1])
결과:
[30, ['김사과', '오렌지', '반하나'], 40, ['🐱', '😃']]
['🐱']
li4 = [10, 20, 30, 40, 50]
li4[1:2] = ['😎', '😊', '🤣']
print(li4)
결과:
[10, '😎', '😊', '🤣', 30, 40, 50]
슬라이싱을 이용하여 요소를 추가한 경우 리스트에 데이터만 포함
li4 = [10, 20, 30, 40, 50]
li4[1] = ['😎', '😊', '🤣']
print(li4)
결과:
[10, ['😎', '😊', '🤣'], 30, 40, 50]
인덱싱을 이용하여 요소를 추가한 경우 리스트 안에 리스트를 만들고 포함한다.
인덱싱을 이용하여 요소를 가져올때 차원이 하나씩 낮아져 리스트가 하나씩 벗겨지고 슬라이싱의 경우에는 그대로 유지한채 가져오게 된다.
반대로 값을 추가 할때도 인덱싱은 차원이 하나더 늘어나서 리스트가 하나더 씌어진 채로 요소 추가가 되고 슬라이싱은 그대로 유지한채 값이 요소가된다.
2-4.리스트 삭제
li5 = [100, 20, 30, 40, 50]
print(li5[1:3])
li5[1:3] = []
print(li5)
결과:
[20, 30]
[100, 40, 50]
빈 리스트를 저장하면 해당 요소가 삭제됨.
li5 = [100, 20, 30, 40, 50]
print(li5)
del li5[2]
print(li5)
결과:
[100, 20, 30, 40, 50]
[100, 20, 40, 50]
del 함수를 이용하여 요소를 삭제 할수있슴.
2-5.리스트 결합
li6 = [10, 20, 30]
li7 = [40, 50, 60]
print(li6 + li7)
print(li7 + li6)
결과:
[10, 20, 30, 40, 50, 60]
[40, 50, 60, 10, 20, 30]
리스트 + 리스트 의 경우 문자열 처럼 결합이 된다.
결합하는 순서에 맞게 결합이된다.
li6 = [10, 20, 30]
li6 = li6 + [100, 200]
print(li6)
li6 = [10, 20, 30]
li6 += [100, 200] #li6 = li6 + [100, 200]
print(li6)
결과:
[10, 20, 30, 100, 200]
[10, 20, 30, 100, 200]
li6 = [10, 20, 30]
print(li6 * 3)
결과:
[10, 20, 30, 10, 20, 30, 10, 20, 30]
리스트 * n 을 하면 문자열 처럼 뒤에 반복하여 이어붙여 진다.
li6 = [10, 20, 30]
print(li6[0] + li6[2])
li6[1] = '😎'
print(li6)
print(li6[0] + li6[1])
결과:
40
[10, '😎', 30]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-58-2ca50c4a8907> in <cell line: 5>()
3 li6[1] = '😎'
4 print(li6)
----> 5 print(li6[0] + li6[1])
TypeError: unsupported operand type(s) for +: 'int' and 'str'
li6 0 번 인덱스의 타입은 int고 1번의 타입은 str이기때문에 연산이 불가능하여 에러가 나타나게 된다.
이처럼 연산을 할시 데이터 타입에 주의 해야한다.
2-6. 리스트 메서드
2-6-1. len(): 객체의 길이를 반환하는 파이썬 내장 함수
li6 = [10, 20, 30]
# len()
print(len(li6))
결과:
3
len 함수 또한 사용이 가능하며 list의 길이를 나타내 준다.
2-6-2. 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]]
append() 를 사용하여 리스트에 요소를 추가 할 수 있다.
2-6-3. extend(): 리스트에 여러 요소를 추가
li6 = [10, 20, 30]
print(li6)
li6.extend([50])
print(li6)
li6.extend([100, 200, 300])
print(li6)
결과:
[10, 20, 30]
[10, 20, 30, 50]
[10, 20, 30, 50, 100, 200, 300]
extend() 를 사용하면 여러 요소가 순서대로 잘 추가가된다.
2-6-4. pop() : 리스트 마지막 요소를 삭제하고 삭제된 요소를 반환하는 함수
li6 = [10, 20, 30]
print(li6)
# pop() : 리스트 마지막 요소를 삭제하고 삭제된 요소를 반환
# print(li6.pop())
temp = li6.pop()
print(li6)
print(temp)
결과:
[10, 20, 30]
[10, 20]
30
pop() 을 사용하여 리스트에서 마지막 요소를 삭제해 주고 삭제한 요소를 저장 할수 있다 이때 변수를 사용해 변수에 저장할수 있다.
2-6-5. insert(): 리스트의 특정 인덱스에 요소를 한개만 추가
li6 = [10, 20, 30]
print(li6)
# insert(): 리스트의 특정 인덱스에 요소를 한개만 추가
li6.insert(1,100)
print(li6)
li6.insert(2,[1000,2000])
print(li6)
결과:
[10, 20, 30]
[10, 100, 20, 30]
[10, 100, [1000, 2000], 20, 30]
insert() 를 이용하여 n번째 자리에 요소를 추가 할수있다. 단 한번에 한개의 요소만 넣을수 있고 리스트로 감쌀시 리스트가 추가 된다.
2-6-6. index(): 리스트에서 특정 값의 인덱스를 반환
li6 = [10, 20, 30]
print(li6)
print(li6.index(20))
# print(li6.index(100)) 해당 값이 없으면 ValueError: 100 is not in list
결과:
[10, 20, 30]
1
index() 를 이용하여 해당 값의 index를 알수있다.
2-6-7. reverse(): 리스트의 요소들의 순서를 반대로 변경 후 저장을 한다
li7 = [100, 50, 70, 60, 20]
print(li7)
li7.reverse()
print(li7)
결과:
[100, 50, 70, 60, 20]
[20, 60, 70, 50, 100]
reverse() 를 이용하여 요소의 순서를 반대로 뒤집을수 있다.
li7 = [100, 50, 70, 60, 20]
print(li7)
# 슬라이싱을 사용하여 리스트의 순서를 뒤집는 방법
# [start:stop:step]
# start를 생략하면 -1로 간주.
# stop을 생략하면 0으로 간주.
print(li7[::-1])
# step이 -1이므로, 앞으로 하나씩 슬라이싱
결과:
[100, 50, 70, 60, 20]
[20, 60, 70, 50, 100]
슬라이싱을 이용하여 순서를 반대로 바꿀수도 있다.
2-6-8. sort(): 리스트의 요소를 정렬(기본값은 오름차순 이고 reverse 값을 True 로 바꾸면 내림차순으로 정렬 된다.)
li7 = [100, 50, 70, 60, 20]
print(li7)
# sort(): 리스트의 요소를 정렬
li7.sort() # 오름차순
print(li7)
li7.sort(reverse=True) # 내림차순
print(li7)
결과:
[100, 50, 70, 60, 20]
[20, 50, 60, 70, 100]
[100, 70, 60, 50, 20]
sort() 를 이용하여 요소를 정렬하고 저장 해 준다.
li8 = ['Apple', 'apple', 'orange', 'melon']
li8.sort()
print(li8)
결과:
['Apple', 'apple', 'melon', 'orange']
문자열 또한 정렬이 가능하며 첫번째 글자, 두번째 글자,... 순으로 아스키코드 기준으로 정렬한다.
li9 = ['김사과', '오렌지', '반하나', '이메론', '배애리']
li9.sort()
print(li9)
결과:
['김사과', '반하나', '배애리', '오렌지', '이메론']
한글 또한 정렬이 가능하며 유니코드 기준으로 정렬한다.
파이썬 의 내장 함수인 sorted() 와 비교
※ sorted(): 모든 요소를 정렬한 후 반환해주는 함수
li7 = [100, 50, 70, 60, 20]
print(li7)
print(sorted(li7))
print(li7)
result = sorted(li7)
print(result)
결과:
[100, 50, 70, 60, 20]
[20, 50, 60, 70, 100]
[100, 50, 70, 60, 20]
[20, 50, 60, 70, 100]
li7 = [100, 50, 70, 60, 20]
print(li7)
result = sorted(li7, reverse=True)
print(result)
결과:
[100, 50, 70, 60, 20]
[100, 70, 60, 50, 20]
sort 는 리스트 내에서만 쓸수 있고 sorted 는 파이썬 내에서 사용 가능하다.
sort 는 inplace 연산으로 정렬을 한뒤 저장 해 주지만 sorted 는 반환을 해주고 저장을 하려면 변수에 저장 하여야 한다.
2-6-9. count() : 리스트에서 특정 요소의 갯수를 반환
li10 = [10, 20, 30, 40, 50, 20 ,40 ,30 ,20]
print(li10.count(20))
print(li10.count(100))
결과:
3
0
리스트 내에 특정 요소의 갯수를 알려준다 값을 저장 하려면 함수를 이용해야 한다.