파이썬 python/파이썬 기초 basic
02 컬렉션
ynzify
2023. 5. 1. 02:29
함수(Function)와 메서드(Method)
함수
- 어떤 작업을 수행하기 위해 독립적으로 설계된 코드의 집합
- 어떤 입력값을 받아 처리과정을 거쳐 출력을 하거나 반환 하는 기능을 수행
>>> func someFunction{
>>> //some code
>>> }
매서드(Method)
- 객체의 소속되어 있는 함수
- 밑에 예시처럼 어떤 객체 안에서만 실행되는 함수
>>> class someClass{
>>> func someMethod{
>>> //some code
>>> }
>>> }
컬렉션 자료형 (Collection Data Type)
- 다수의 데이터를 그룹화한 자료형이다
- 여러가지 객체를 하나로 묶어서 사용하는 데이터 타입
- ex) list, set, dict, tuple
자료형의 특징
- Sequence 자료형
- 안에 요소들이 연속적으로 이어져 있다
- 순서가 있다 (순번이 있다)
- 순번을 index라 칭한다
- Mutable 자료형
- 수정 가능한 객체
- list, set, dict
- Immutable 자료형
- 수정이 불가능한 객체
- int, float, str, bool, tuple
List
- sequence 자료형
- mutable 자료형
- [ ]을 이용해서 만든다
>>> lst = [1,2,3,"four",None,7.0,True]
>>> lst
[1, 2, 3, 'four', None, 7.0, True]
빈출 내장함수
>>> lst = [11,88,43,40,63]
>>> len(lst) # 리스트 내부의 아이템 갯수 반환
>>> sorted(lst) # reverse=True 줄 경우 내림차순으로 반환
>>> max(lst) # 최대값 반환
>>> min(lst) # 최소값 반환
>>> sum(lst)
>>> round(3.56,1) # 반올림
>>> abs(-2.71828) # 절대값
>>> sum(lst) / len(lst) # 평균
len () 함수는 빈출이니까 꼭 알아두자아~
Sequence 다루기
양수 인덱스: 0부터 시작하여 1씩 증가
음수 인덱스: -1부터 시작하여 1씩 감소
# 다음의 리스트에서 3번째로 높은 값을 추출하고 싶다면?
>>> scores = [60,35,53,70,80,100,81]
>>> tmp = sorted(scores,reverse=True)
>>> tmp[2] # 0부터 시작하니까 2 대입
80
☆슬라이싱 (Slicing)
- 인덱스를 사용해서 범위를 지정해 요소들을 가져오는 기법이다
- 시퀀스 자료형에서 특정 범위의 요소들을 선택해서 가져온다
- [start:end:step] 순서:
- start ~ (end-1)
- step만큼 건너 뛰면서 선택해서 가져옴
- step 생략시 기본값 1이 주어진다
- step 부분은 양수(정방향), 음수(역방향)를 이용해서 방향 설정이 가능하다
>>> lst = [
>>> [1,2,3],
>>> [4,5,6],
>>> [7,8,9]
>>> ]
>>> lst
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> lst[::2]
[[1, 2, 3], [7, 8, 9]]
>>> lst[1][2]
6
>>> lst[0][1:]
[2, 3]
lst = [1,2,3,4,5,6,7,8,9,10]
lst[1] = 1000
lst
패킹(Packing)과 언패킹(Unpacking)
>>> lst = [1,2,3,4,5,6,7,8,9,10]
>>> lst[1] = 1000
>>> lst
[1, 1000, 3, 4, 5, 6, 7, 8, 9, 10]
>>> lst[:1] = [2000] #end 값이 1니까 맨 처음값만 변경
>>> lst
[2000, 1000, 3, 4, 5, 6, 7, 8, 9, 10]
lst[:1] = 100
lst
-> TypeError: can only assign an iterable
lst[:1] = [100]
# 괄호 꼭 넣어주기!
얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)
>>> a = [1,2,3]
>>> b = a
>>> b.append(4)
>>> print(b)
[1, 2, 3, 4]
>>> print(a)
[1, 2, 3, 4]
>>> a = [1,2,3]
>>> b = a[:] # b = a.copy()도 가능
>>> b.append(4)
>>> print(a)
[1, 2, 3]
>>> print(b)
[1, 2, 3, 4]
>>> a = [ 1, 2, [3,4] ]
>>> b = a[:] # b = a.copy()
>>> b[2][1] = 5
>>> print(a)
[1, 2, [3, 5]]
>>> print(b)
[1, 2, [3, 5]]
>>> import copy
>>> a = [ 1, 2, [3,4] ]
>>> b = copy.deepcopy(a)
>>> b[2].append(5)
>>> print(a)
[1, 2, [3, 4]]
>>> print(b)
[1, 2, [3, 4, 5]]
List Method
append
- 리스트의 제일 뒤에 값을 추가함
>>> lst = [1,2,3,4]
>>> lst.append(0) # 0의 값을 추가한다
>>> lst
[1, 2, 3, 4, 0]
sort
- 기복적으로 오름차순으로 정렬한다
- reverse = True 설정은 내림차순 정렬이다
>>> lst = [5,1,3,4]
>>> sorted(lst)
[1, 3, 4, 5]
>>> lst.sort(reverse = True)
[5, 4, 3, 1]
pop
- 제일 뒤에 있는 요소를 반환하면서 삭제한다
- 인덱스 값을 줄 경우 해당 인덱스 값을 반환하면서 삭제
>>> lst = [1,2,3,4]
>>> print(lst.pop())
4
>>> print(lst.pop())
3
>>> print(lst.pop())
2
>>> print(lst.pop())
1
# 앞에서 부터 반환하면서 삭제
>>> lst = [1,2,3,4]
>>> print(lst.pop(0))
1
>>> print(lst.pop(0))
2
>>> print(lst.pop(0))
3
>>> print(lst.pop(0))
4
>>> lst
[]
extend
- 리스트와 리스트를 합친다 (그냥 연장한다 느낌)
>>> lst = [1,2,3]
>>> lst.extend([4,5,6])
>>> lst
[1, 2, 3, 4, 5, 6]
# extend 와 append 의 차이
>>> lst = [1,2,3]
>>> lst.append([4,5,6])
>>> lst
[1, 2, 3, [4, 5, 6]]
insert
- 첫번째 인수는 인덱스 값
- 두번째 인수는 넣을 값
- 인덱스 위체에 값을 추가한다
lst = [1,2,3]
lst.insert(1,9)
lst
[1, 9, 2, 3]
remove
- 리스트에 값을 찾아 삭제
lst = [1,2,3,5,3]
lst.remove(3) # 해당 값을 찾자마자 삭제하고 끝난다.
lst
[1, 2, 5, 3]
index
- 리스트에 인수로 받은 값의 인덱스를 반환한다
lst = [1,2,3,3,2]
lst.index(2)
1
count
- 값을 넣으면 해당 값이 몇개 있는지를 반환한다
lst = [1,2,3,3,2]
lst.count(2)
2
lst = ["python" ,"python" ,"hello"]
lst.count("python")
2
del
- 특정 인덱스 값을 삭제
del lst[0] # 맨 처음 값 삭제
lst
['python', 'hello']
List의 연산
>>> lst1 = [1,2,3]
>>> lst2 = [4,5,6]
>>> lst1 + lst2 # extend 와 결과 같음
[1, 2, 3, 4, 5, 6]
>>> lst1 + [1] # append 와 결과가 같음
[1, 2, 3, 1]
>>> lst1 * 3 # 각 인수에 세배를 곱하는게 아니라 세번 출력
[1, 2, 3, 1, 2, 3, 1, 2, 3]
tuple
- sequence 자료형
- immutable 자료형
- ()를 활용해서 만듬 (생략 가능함)
tuples = ("h","e","l","l","o")
tuples
('h', 'e', 'l', 'l', 'o')
tuples = "h","e","l","l","o"
tuples[0] = "h" # 수정 불가능한 객체이기 때문에 에러발생!
-> TypeError: 'tuple' object does not support item assignment
count
- 값을 넣으면 값이 몇개인지 반환해줌
tuples.count('l')
2
index
- 값이 몇 번째 인덱스에 위치해 있는지 반환해준다
tuples.index('e')
1
set
- non-sequence 자료형 (데이터 저장 순서 보장 x)
- mutable 자료형
- 중요한 특징으로 중복 데이터를 허용하지 않는다
- {}이용
sets = {1001,1001,1001,1001,1001,10,10,10,3,4,6,653,3,23,3,42,34,34}
sets
{3, 4, 6, 10, 23, 34, 42, 653, 1001}
sets[0] # 순번이 없기 때문에 인덱스로 접근하면 에러가 난다.
-> TypeError: 'set' object is not subscriptable
in과 not in 연산자도 사용 가능
sets = {1001,1001,1001,1001,1001,10,10,10,3,4,6,653,3,23,3,42,34,34}
3 in sets
1001 not in sets
True
False
메소드 몇개 이용해보기
>>> A = {1,2,3}
>>> B = {2,3,4}
>>> A, B
({1, 2, 3}, {2, 3, 4})
>>> A.intersection(B)
{2, 3}
>>> A.union(B)
{1, 2, 3, 4}
>>> A.difference(B)
{1}
a = {1,2,3}
a.add(4) # 값을 추가하는데 중복값일 경우 추가하지 않는다.
a
{1, 2, 3, 4}
a.update([1,2,3,4,5,6]) # 여러 요소를 중복을 제외하고 추가한다.
a
{1, 2, 3, 4, 5, 6}
a.remove(2)
a
{1, 3, 4, 5, 6}
Dictionary
dict
- non-sequence 자료형
- mutable 자료형
- key:value 구조의 자료형
- key 값은 문자열 숫자열 둘 다 가능
- key는 중복을 허용하지 않음
- value는 중복을 허용
# 이런 형식 {}이 괄호 사용
{
key:value,
key:value
...
}
# 사람이름을 key로, 나이를 value로 해서 dict를 만들어보자.
>>> age = {
>>> "관수": 43,
>>> "철수": 30,
>>> "길동": None
>>> }
>>> age
>>> {'관수': 43, '철수': 30, '길동': None}
>>> age["관수"]
43
# 없는 키에 접근하려 한다면?? 에러 발생
age["민수"]
-> NameError: name 'age' is not defined
get method 이용
# 없는 키에 접근해도 에러가 발생하지 않는다.
print(age.get("민수"))
age.get("민수","없는사람이야")
None
'없는사람이야'
key와 value를 추가/변경 하기
>>> age = {
>>> "관수": 43,
>>> "철수": 30,
>>> "길동": None
>>> }
>>> age["민수"] = 20 # 해당 키가 없을 경우 키와 벨류를 새로 생성
>>> age
{'관수': 43, '철수': 30, '길동': None, '민수': 20}
>>> age["민수"] = 19 # 해당 키가 있을 경우 벨류를 변경
>>> age
{'관수': 43, '철수': 30, '길동': None, '민수': 19}
>>> add_age = {"철수": 35, "영숙": 25}
>>> age.update(add_age)
>>> age
{'관수': 43, '철수': 35, '길동': None, '민수': 19, '영숙': 25}
key 삭제하기
>>> del age["영숙"]
>>> age
{'관수': 43, '철수': 35, '길동': None, '민수': 19}
>>> v = age.pop("민수") # 해당 key의 value를 반환하며 삭제
>>> print(v) # 민수 사라짐
19
>>> print(age)
{'관수': 43, '철수': 35, '길동': None}
>>> age.keys() # key 값들만 반환
dict_keys(['관수', '철수', '길동'])
>>> age.values() # value 값들만 반환
dict_values([43, 35, None])
>>> age.items() # key와 value가 튜플에 담겨 리스트에 들어가며 반환
dict_items([('관수', 43), ('철수', 35), ('길동', None)])
>>> sum(age.values())
128
>>> len(age.values())
3
>>> "관수" in age.keys()
True
컬랙션 끼리의 Type Casting
괄호의 차이를 보아라!
# list -> tuple
lst = [1,2,3]
tuple(lst)
(1, 2, 3)
# tuple -> list
tup = 1,2,3
list(tup)
[1, 2, 3]
# list -> set
set(lst)
{1, 2, 3}
>>> age = {
>>> "관수": 43,
>>> "민수":30,
>>> "길동":None
>>> }
>>> list(age)
['관수', '민수', '길동']
>>> list(age.keys())
['관수', '민수', '길동']
>>> list(age.values())
[43, 30, None]
>>> list(age.items())
>>> tmp
[('관수', 43), ('민수', 30), ('길동', None)]
>>> dict(tmp)
{'관수': 43, '민수': 30, '길동': None}