데이터 사이언스/파이썬
Ch 2. 파이썬 자료구조
수학과인데 공대생
2023. 7. 4. 17:20
728x90
1. 리스트 (List)
- 여러가지 자료를 저장할 수 있는 데이터 구조체 Link to list
- 요소(value) : 리스트 내 데이터를 의미
- 인덱스(index) : 리스트 내 데이터의 주소
(1). 일차원 리스트
li = [1, 2, 3, 4, 5]
print(li)
# [1, 2, 3, 4, 5]
(2). 다차원 리스트
matrix = [[1, 2, 3, 4, 5], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]
print(matrix)
# [[1, 2, 3, 4, 5], [5, 6, 7, 8, 9], [10, 12, 13, 14, 15], [16, 17, 18, 19, 20]]
(3). 슬라이싱 (데이터 접근)
- array[index] : 특정 인덱스의 값 접근
- array[start:stop:step] : 특정 범위의 값 접근
- array[-stop] : 뒤에서 부터 접근
- array[index][index] : 다차원 리스트 접근
- list.index(value) : value의 index를 반환
- zip(list1, list2) : 2개의 리스트를 받아서 항목을 2개를 묶어서 제공
- 숫자 0부터 시작
- 범위를 벗어난 인덱스 접근시 error 발생
matrix = [[1, 2], [3, 4]]
print(matrix[1][1])
# 4
print(matrix[0][0:])
# [1, 2]
li = [1, 2, 3, 4, 5]
print(li[-2])
# 4
print(li[0:4:2])
# [1, 3]
print(li.index(5))
# 4
li1 = [1, 2, 3] # 개수가 달라도 가능
li2 = [4, 5, 6]
for a in zip(li1, li2) :
print(a)
# (1, 4)
# (2, 5)
# (3, 6)
for a, b in zip(li1, li2) :
print(a)
print(b)
# 1
# 4
# 2
# 5
# 3
# 6
(4). 리스트 연산자
- + : 리스트 합치기
- * : 리스트 반복하기
- in : 특정 값 포함 여부 확인, True 또는 False 출력
- not in : 특정 값 불포함 여부 확인, True 또는 False 출력
li1 = [1, 2, 3]
li2 = [4, 5, 6]
li3 = li1 + li2
print(li3)
# [1, 2, 3, 4, 5, 6]
print(li1 * 2)
# [1, 2, 3, 1, 2, 3]
print(5 not in li1)
# True
(5). 리스트 관련 함수
- list.append(value) : 마지막에 요소 추가
- list.insert(index, value) : 인덱스에 요소 추가
- list1.extend(list2) : 리스트 뒤에 확장 또는 추가 -> + 연산자와 동일
li1 = [1, 2, 3]
li2 = [4, 5, 6]
li1.append(11)
print(li1)
# [1, 2, 3, 11]
li1.insert(1, 7)
print(li1)
# [1, 7 ,2, 3, 11]
li1.extend(li2)
print(li1)
# [1, 7, 2, 3, 11, 4, 5, 6]
- del list[index] : 리스트 내 하나의 요소 제거
- del list[index:index] : 특정 범위의 요소들 제거
- del list[:index] : 처음부터 인덱스 바로 직전까지 제거
- list.pop(index) : 리스트 내 하나의 요소 제거, del과 유사
- list.remove(value) : 특정 값을 지정하여 제거, 단 처음 하나만 제거
- list.clear() : 요소들 모두 제거
li = [1, 2, 3, 4, 5, 6, 7, 8]
del li[2]
print(li)
# [1, 2, 4, 5, 6, 7, 8]
del li[1:3]
print(li)
# [1, 5, 6 ,7, 8]
del li[:2]
print(li)
# [6, 7, 8]
li.pop() # 파라미터가 없으면 마지막 제거 -> del 과 유사
print(li)
# [6, 7]
li.remove(6)
print(li)
# [7]
li.clear()
print(li)
# []
- list.sort() : 정렬
- sorted(list) : 정렬된 새로운 리스트 반환
li1 = [10, 3, 7, 9, 2]
li.sort()
print(li)
# [2, 3, 7, 9, 10]
- len(list) : 리스트의 길이 측정
- min(list) : 최소값 가져오기
- max(list) : 최대값 가져오기
- sum(list) : 모든 요소의 합계
- all(list) : 모든 요소가 참이면 참 반환
- any(list) : 한 요소라도 참이면 참 반환
- enumerate(list) : 인덱스와 요소를 함께 반환
- random.choice(list) : 리스트에서 랜덤 선택
li = [1, 2, 3]
print(all(li))
# True
for i in enumerate(li) :
print(i)
# (0, 1)
# (1, 2)
# {2, 3)
import random
li = [1, 2, 3]
print(random.choice(li))
# li 중 하나 임의로 반환
(6). 리스트와 함수
- call by value -> 변수 복사
- call by reference -> 주소를 참조
def A(a, b) :
a += 1
x = 1
y = 1
A(x, y) # 1을 a에 복사
print(x)
# 1
def A(a, b) :
a[1] = 7
x = [1, 2, 3]
y = 1
A(x, y) # a가 리스트 주소를 참조
print(x)
# [1, 7, 3]
(7). 리스트 함축
- 리스트의 요소를 생성하는 문장을 리스트 안에 넣어 집합 생성
- 파이썬만이 가진 독특한 문법
- [수식 (for 변수 in 리스트) if 조건]
A = [2*x + 1 for x in range(6) if x%2 == 0]
print(A)
# [1, 5, 9]
2. 튜플 (Tuple)
- 리스트와 유사하나 수정이 불가한 자료구조
- ( , , )
- 요소가 1개인 튜플은 요소의 끝에 반드시 쉼표(,) 추가
- 데이터 변경 금지(locking) 효과
- 반복문에서 리스트보다 빠름
- 딕셔너리의 키가 될 수 있음
(1). 리스트와 튜플 변환
- 리스트와 튜플은 서로 변환이 가능
- tp = tuple(list), li = list(tp)
(2). Packing / Unpacking
- Packing : tuple = (value, value, value)
- Unpacking : (a, b, c) = tuple
tp = (1, 2, 3) # Packing
(a, b, c) = tp # Unpacking
(3). 변경 불가 예외사항
- += 연산자를 통한 튜플 연장은 가능
- 튜플 내 리스트가 있을 경우 리스트는 수정 가능
- 리스트에 튜플을 추가하는 것 가능 (list += tuple)
a = [11, 12, 13]
b = (4, 5, [1, 2], 6)
c = (1, 2)
b[2][0] += 7
print(b)
# (4, 5, [8, 2], 6)
a += b
print(a)
# [11, 12, 13, 4, 5, [8, 2], 6]
print(c * 2)
# (1, 2, 1, 2)
3. 세트 (Set)
- 고유한 값들을 저장하는 자료구조
- 순서대로 저장되지 않으며, 인덱스를 통한 접근 불가
- { , , }
(1). 리스트와 세트 변환
- 리스트와 세트는 서로 변환이 가능
- s = set(li), li = list(s)
- 하나의 요소를 가진 문자열은 문자로 나뉨
li = [1, 1, 3, 3, 5]
s = set(li)
print(s)
# {1, 3, 5}
(2). 추가 / 삭제
- 세트는 튜플과는 달리 추가 / 삭제가 가능
- 인덱스가 없기 때문에 추가 / 삭제 시 add(), remove() or dicard() 사용
- set.clear(), set.update(list) 가능
s = {1, 3, 5}
li = [1, 2]
s.add(9)
print(s)
# {1, 3, 5, 9}
s.remove(1)
print(s)
# {3, 5, 9}
s.discard(3)
print(s)
# {5, 9}
s.update(li) # list를 set에 넣을 수 있음
print(s)
# {1, 2, 5, 9}
(4). 세트 연산자
- A < B 또는 A.issubset(B) : 부분집합 판단
- A == B 또는 A != B : 동일 또는 다른 집합인지 판단
- A | B 또는 A.union(B) : 합집합 도출
- A & B 또는 A.intersection(B) : 교집합 도출
- A - B 또는 A.difference(B) : 차집합 도출
A = {1, 2, 3, 4, 5}
B = {1, 2, 11}
print(A | B)
# {1, 2, 3, 4, 5, 11}
print(A & B)
# {1, 2}
print(A - B)
# {3, 4, 5}
4. 딕셔너리 (Dictionary)
- key를 기반으로 value 저장
- value에는 list가 올 수 있음
- { key : value, key : value, key : value }
- key는 변수로 지정 가능
me = {"주전공" : "수학과", "복수전공" : "컴퓨터공학과", "거주지" : "대전광역시"}
print(me["주전공"])
# 수학과
(1). 탐색
- 딕셔너리명[key] : 키를 통한 데이터 접근
- 딕셔너리명.get(key, value1) : key가 딕셔너리있으면 해당하는 value를 반환하고 없으면 value1을 반환
- 딕셔너리명.keys() : 모든 keys 반환
- 딕셔너리명.values() : 모든 values 반환
- 딕셔너리명.itmes() : 모든 keys와 values 반환
me = {"주전공" : "수학과", "복수전공" : "컴퓨터공학과", "거주지" : "대전광역시"}
print(me.get("부전공"))
# None
print(me.get("부전공", "부전공은 안함."))
# 부전공은 안함.
print(me.keys())
# dict_keys(['주전공', '복수전공', '거주지'])
print(me.values())
# dict_values(['수학과', '컴퓨터공학과', '대전광역시'])
print(me.items())
# dict_items([('주전공', '수학과'), ('복수전공', '컴퓨터공학과'), ('거주지', '대전광역시')]) -> 튜플
(2). 수정 및 추가
- 딕셔너리명[key] = value : 키가 존재하면 수정, 존재하지 않으면 추가
- 딕녀너리1.update(딕셔너리2) : 수정하거나 추가할 때 사용
me1 = {"주전공" : "수학과", "복수전공" : "컴퓨터공학과", "거주지" : "대전광역시"}
me2 = {"주전공" : "컴퓨터공학과", "복수전공" : "수학과 ", "국적" : "대한민국"}
me1["거주지"] = "서울특별시"
print(me1)
# {'주전공': '수학과', '복수전공': '컴퓨터공학과', '거주지': '서울특별시'}
me1.update(me2)
print(me1)
# {'주전공': '컴퓨터공학과', '복수전공': '수학과', '거주지': '서울특별시', '국적': '대한민국}
(4). 딕셔너리 함축
- 리스트로부터 딕셔너리의 요소를 생성하는 문장을 딕셔너리 안에 넣어 집합 생성
- 파이썬만이 가진 독특한 문법
- dic = {x*x for x in list if x%2 == 0}
li = [1, 2, 3]
dic = {x : x**x for x in li}
print(dic)
# {1: 1, 2: 4, 3: 27}
728x90