자료구조(파이썬) - 자료구조 기초

LSH·2023년 7월 31일
0

교육 정보

  • 교육 명: 경기미래기술학교 AI 교육
  • 교육 기간: 2023.05.08 ~ 2023.10.31
  • 오늘의 커리큘럼:
    파이썬 자료구조
    (7/17 ~ 7/28)
  • 강사: 이현주, 이애리 강사님
  • 강의 계획:
    1. 자료구조

자료구조

  • call by value, call by reference
    • 파이썬의 함수호출방식은 매개변수가 불변타입이면 값을 복사, 가변타입이면 레퍼런스를 복사하는데 이 방식을 할당(Assignment) 호출이라고 함
def twofold(a):
  a = a * 2
x = 5
# 불변객체이기 때문에 call by value 형식으로 값인 5만 인자로 넘겨짐 
# → x 값은 변하지 않음 
twofold(x)
print(x)
#
# 결과
5
def test(a, b):
  a = a * 2
  b.append('test')
x = 5
y = [1, 2]
test(x, y)
print(x) # call by value
print(y) # call by reference 
#
# 결과
5
[1, 2, 'test']

  • 파이썬의 리스트
    • 파이썬에서의 리스트 = 요소에 대한 포인터 목록(ob_item, 주소 목록)을 적고 있는 구조체로 선언
      리스트에 요소를 추가하거나 조작하기 시작하면 ob_item 의 사이즈를 조절해 나가는 형태로 구현
      → 즉 리스트는 객체로 구현되어 있는 모든 자료형을 포인터로 연결, 연결 리스트에 대한 포인터 목록을 배열형태로 관리, 다양한 타입을 동시에 단일 리스트에 관리하는 것이 가능 (대신 속도는 희생)
    • 마찬가지로 배열이 갖는 상당 부분의 단점을 가지고 있음 예를 들어 중간에 원소를 삽입하면 삽입한 원소 이후의 원소들은 모두 오른쪽으로 한칸씩 시트트 해야 한다거나 확보해 놓은 배열 공간이 다 찼을 때 새로운 배열을 할당 받아 기존의 배열 내용릉 복사해야 하는 것

  • 파이썬의 튜플
    • 튜플은 읽기 전용이므로 보안이 필요한 요소에 사용하기 좋음
    • 리스트는 추가될것을 예상하여 추가 공간을 부여하지만 튜플은 변경할 수 없으므로 추가 공간을 부여 할 필요가 없음 -> 더 적은 메모리 공간 사용
    • 리스트보다 성능이 빠름
    • 딕셔너리의 키로 사용 가능

  • 리스트와 튜플의 패킹 언패킹
first, *rest = [1, 2, 3 ,4, 5]
print(first)
print(rest)
def ex_args(a, b, c):
  return a * b * c 
L = [2, 3, 4]
print(ex_args(*L))
print(ex_args(3, *L[1:]))
#
# 결과
1
[2, 3, 4, 5]
24
36
x = (1, 2, 3)
print(x)
#
# 결과
(1, 2, 3)
a, b, c = x
print(a, b, c)
*d, e = x
print(d, e)
d, *e = x
print(d, e)
#
# 결과
1 2 3
[1, 2] 3
1 [2, 3]

  • 딕셔너리
    • 해시테이블로 되어있어서 입력과 조회 연산의 시간 복잡도가 모두 O(1) 임

  • Collections 모듈의 다양한 dictionary 타입

    • defaultdic: 기본 자료형을 지정. 존재하지 않는 키 조회시 기본 자료형 기준 디폴트 값을 가지는 해당 키 생성

    • OrderedDict(파이선 3.7부터는 기본 dict이 순서를 유지해서 쓸 일이 없음)

    • Counter: 해시 가능한 객체를 카운팅 하는 서브클래스
  • counter

import collections
a = [1,2,3,4,5,5,5,6,6]
collections.Counter(a)
#
# 결과 
Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 3, 6: 2})
seq = "파이썬 리눅스 유닉스 C C++ 파이썬 유닉스 자바 파이썬 리눅스"
a = list(seq.split(' '))
print(a)
 collections.Counter(a).most_common(3)
#
# 결과 
['파이썬', '리눅스', '유닉스', 'C', 'C++', '파이썬', '유닉스', '자바', '파이썬', '리눅스']
[('파이썬', 3), ('리눅스', 2), ('유닉스', 2)]
  • counter update
from collections import Counter

def counter_example():
    """ 항목의 발생 횟수를 매핑하는 딕셔너리를 생성한다. """
    seq1 = [1, 2, 3, 5, 1, 2, 5, 5, 2, 5, 1, 4]
    seq1_counts = Counter(seq1)
    print(seq1_counts)

    """ 항목의 발생 횟수를 수동으로 갱신하거나, update() 메서드를 사용할 수 있다. """
    seq2 = [1, 2, 3]
    seq1_counts.update(seq2)
    print(seq1_counts)
  • counter & update, 연산
from collections import Counter

def counter_example():
    """ 항목의 발생 횟수를 매핑하는 딕셔너리를 생성한다. """
    seq1 = [1, 2, 3, 5, 1, 2, 5, 5, 2, 5, 1, 4]
    seq1_counts = Counter(seq1)
    print(seq1_counts)

    """ 항목의 발생 횟수를 수동으로 갱신하거나, update() 메서드를 사용할 수 있다. """
    seq2 = [1, 2, 3]
    seq1_counts.update(seq2)
    print(seq1_counts)

    seq3 = [1, 4, 3]
    for key in seq3:
      seq1_counts[key] += 1
    print(seq1_counts)


    """ a+b, a-b와 같은 셋 연산을 사용할 수 있다. """
    seq3_counts = Counter(seq3)
    print(seq3_counts)
    print(seq1_counts + seq3_counts)
    print(seq1_counts - seq1_counts)


if __name__ == "__main__":
    counter_example()
    
#
# 결과

Counter({5: 4, 1: 3, 2: 3, 3: 1, 4: 1})
Counter({1: 4, 2: 4, 5: 4, 3: 2, 4: 1})
Counter({1: 5, 2: 4, 5: 4, 3: 3, 4: 2})
Counter({1: 1, 4: 1, 3: 1})
Counter({1: 6, 2: 4, 3: 4, 5: 4, 4: 3})
Counter()

if name=='main': 의미
참고

profile
:D

0개의 댓글