스터디/파이썬 스터디 강의자료

[2팀/김가림, 최다예] 7차시 파이썬 스터디 자료구조

omomirg 2023. 5. 11. 23:12

7차시_자료구조_강의자료.pdf
1.23MB
7차시_자료구조_과제.pdf
0.43MB

 

자료구조

참고도서 : 데이터 과학을 위한 파이썬 프로그래밍, 최상철

자료구조의 이해

  • 자료구조(data structure)의 개념실생활에서 찾아볼 수 있는 대표적인 데이터 저장 사례 : 전화번호이름을 가나다 순서대로 저장, 요즘 많이 사용하는 휴대전화의 연락처에 전화번호를 저장하고 보여주는 방식전화번호부 이외에도 실생활에서 데이터의 특징을 반영하여 저장해야 할 정보의 예 ex. 은행의 번호표 처리방식대기 인원이 1씩 증가. 해당 사용자가 은행 서비스 이용을 종료하면 1씩 감소 번호표의 번호 정보와 현재 대기 인원을 모두 관리해야 효율적으로 데이터 관리 가능나중에 배달하는 수화물일수록 트럭 안쪽에 쌓고, 먼저 배달하는 수화물일수록 트럭 입구쪽에 이렇게 데이터의 특징을 고려한 저장 방식은 매우 유용하게 사용되어 진다.
  • 자료구조 : 특징이 있는 정보를 메모리에 효율적으로 저장 및 반환하는 방법으로 데이터를 관리하는 방식 특히 대용량일수록 메모리에 빨리 저장하고 검색해 메모리를 효율적으로 사용해야 실행 시간을 줄일 수 있음
  • ex. 택배 수화물을 트럭에 쌓을 때 위치 정보 저장
  • 은행의 번호표는 번호표 단말기에서 사용자가 번호표를 하나씩 뽑으면
  • 자료구조(data structure) : 데이터의 특징을 고려하여 저장하는 방법
  • 과거 전화번호부에는 전화번호를 효율적으로 찾기 위해
  • 프로그래밍을 하다보면 다양한 형태의 데이터를 저장하여 처리할 때가 있음
  • 파이썬에서의 자료구조자료구조명특징 
    스택 (stack) 나중에 들어온 값아 먼저 나갈 수 있도록 해주는 자료구조 (last in first out)
    큐 (queue) 먼저 들어온 값이 먼저 나갈 수 있도록 해주는 자료구조 (first in first out)
    튜플 (tuple) 리스트와 같지만 데이터의 변경을 허용하지 않는 자료구조
    세트 ( set) 데이터의 중복을 허용하지 않고, 수학의 집합 연산을 지원하는 자료구조
    딕셔너리  
    (dictionary) 전화번호부와 같이 키(key)와 값(value)의 형태로 데이터를 저장하는 자료구조이며 여기서 키값은 다른 데이터와 중복을 허용하지 않음
    collection 모듈 위에 열거된 여러 자료구조를 효율적으로 사용할 수 있도록 지원하는 파이썬 내장(built-in) 모듈
  • 자료구조의 기본 저장 방식 > list

스택과 큐

  • 스택(stack)스택을 간단히 표현하면 ‘Last In First Out’으로 정의
    • 스택의 활용 사례먼저 배달해야 하는 수화물은 트럭의 입구쪽에, 나중에 배달해야 하는 수화물은 트럭의 안쪽에 넣어야 한다. 수화물을 하나의 데이터로 본다면 먼저 들어간 수화물보다 나중에 들어간 수화물이 먼저 나와야 하는 경우파이썬에서는 리스트를 사용하여 스택을 구현할 수 있다. 리스트라는 저장 공간을 만든 후 append() 함수로 데이터를 저장(push)하고 pop() 함수로 데이터를 추출(pop)한다.먼저 변수 a에 [1, 2, 3, 4, 5]가 할당 그 후 변수 a에 10과 20을 추가하면 변수 a에 [1, 2, 3, 4, 5, 10, 20]이 할당 다음으로 pop() 함수를 사용하면 가장 마지막에 저장된 값을 추출하고 리스트에서 삭제
    • pop() 함수를 처음 실행하면 가장 마지막에 저장된 20이 추출되면서 화면에 출력되고, 동시에 변수 a의 값은 [1, 2. 3. 4, 5, 10]으로 바뀐다. 다시 pop() 함수를 실행하면 마지막에 저장된 10이 추출되면서 화면에 출력되고, 동시에 변수 a의 값은 [1, 2, 3, 4, 5]로 바뀐다.
    • 수화물과 비슷한 개념의 데이터가 있다면 스택으로 저장했을 때 좀 더 쉽게 데이터를 추출
    • 택배 수화물을 저장하는 방식
    • 스택으로 만들 수 있는 프로그램: 2로 나눈 나머지 값을 스택에 푸시한 후 마지막으로 들어온 값부터 팝으로 추출하고 출력
      word = input("Input a word: ")
      word_list = list(word)
      print(word_list)
      
      result = []
      for _ in range(len(word_list)):
          result.append(word_list.pop())
      
      print(result)
      print(word[::-1])
      
      일반적으로 for문에서 많이 쓰이며 for문에 _ 기호가 있으면 해당 반복문에서 생성되는 값은 코드에서 사용하지 않는다는 뜻이다range(len(world_list))에서 생성되는 값을 반복문 내에서 사용하지 않으므로 _로 할당
    • </aside>
    • <aside> 📌 _ 기호 : 파이썬에서 굉장히 많이 쓰이는 코드 중 하나
    • 먼저 입력한 텍스트는 변수 word에 저장되고 그 값을 리스트형으로 변환한다. 그 후 값을 차대로 추출하면 입력한 텍스트의 역순값이 출력된다
    • (2) 입력한 텍스트를 역순으로 출력하는 프로그램
    • (1) ‘이진수 변환기’ 프로그램
  • 4,10과 같은 데이터를 저장하는 공간으로 리스트와 비슷하지만 저장 순서가 바뀌는 형태를 스택 자료구조(stack data structure) 라고 한다. 스택에 데이터를 저장하는 것을 푸시 , 데이터를 추출하는 것을 팝(pop)이라고 한다.
  • 일반적으로 스택이라고 하면 위 그림에서 볼 수 있는 사각형의 저장 공간을 뜻한다
  • 즉, 마지막에 들어간 데이터가 가장 먼저 나오는 형태로 데이터의 저장 공간 구현
  • 스택은 자료구조의 핵심 개념 중 하나
  • 큐(queue)큐는 먼저 들어간 데이터가 먼저 나오는 ‘Fist in First Oiitmo’의 메모리 구조를 가지는 자료구조이다.
    • 큐의 활용 사례먼저 온 사람이 앞의 번호표를 뽑고, 번호가 빠른 사람이 먼저 서비스를 받는 구조스택은 메모리가 시작하는 지점이 고정되어 있지만, 큐는 처음에 값이 저장되는 메모리 주소가 값이 사용됨에 따라 계속 바뀜 But 파이썬에서는 이러한 부분이 자동으로 구현되므로 어렵지 않게 사용할 수 있다.기본적으로 스택의 구현과 같음즉, pop() 함수가 리스트의 마지막 값을 가져온다고 하면 pop(0)은 맨 처음 값을 가져온다는 뜻
    • a = [1, 2, 3, 4, 5] a.append(10) # a = [1, 2, 3, 4, 5, 10] a.append(20) # a = [1, 2, 3, 4, 5, 10, 20] a.pop(0) # 1 a.pop(0) # 2
    • pop() 함수를 사용할 때 인덱스가 0번째인 값을 쓴다는 의미로 pop(0)을 사용하면 된다.
    • 파이썬에서 큐를 구현하는 것은 매우 간단하다.
    • 메모리 개념으로 볼 때 큐는 스택보다 구현이 조금 더 복잡
    • 은행에서 대기 번호표를 뽑을 때 번호를 저장하는 방식
  • 스택의 반대 개념

튜플과 세트

  • 튜플 (tuple)
    t = (1, 2, 3)
    print(t +1 , t * 2)
    # (1, 2, 3, 1, 2, 3) (1, 2, 3, 1, 2, 3)
    len(t)
    # 3
    
    첫 번째 줄 : 튜플 선언 명령리스트는 대괄호 사용 but 선언 외에 여러 가지 연산은 리스트와 같은 방식이다.튜플 간의 덧셈, 곱셈 그리고 len() 함수와 같이 리스트형 데이터에 사용하는 모든 함수 사용튜플의 값은 마음대로 변경할 수 없다<aside> ❓ 만약 값이 하나밖에 없다면?t = (1)과 같은 코드가 생각날 수도 있다.따라서 값이 하나일 때는 t = (1, )와 같이 반드시 콤마(,)를 붙여 t가 튜플임을 선언해야 한다.
    • 튜플의 활용 사례이때 반환해주는 타입을 튜플로 선언하면 받아서 사용하는 사람이 마음대로 데이터를 못바꿈프로그래머가 이러한 이해 없이 마음대로 값을 변경하는 것을 방지
    • 그렇다면 바뀌면 안 되는 데이터에는 어떤 것이 있을까? : 학번이나 이름, 주민등록번호와 같이 변경되면 안 되는 정보
    • 프로그래밍을 하다 보면 여러 사람과 함께 작업해야 하는 경우가 많다. 자신이 하나의 함수만 만들고, 다른 사람이 그 함수의 결과값을 사용해야 하는 경우도 발생
  • but 파이썬은 이렇게 선언할 경우 t = 1로 이해한다. t = (5 + 2)* 2와 같이 연산에서 사용하는 괄호로 이해하는 것이다.
  • </aside>
  • 만약 튜플의 값을 변경하려고 하면 오류 발생
  • 튜플과 리스트의 유일한 큰 차이:
  • 리스트에서 사용하는 연산, 인덱싱, 슬라이싱이 모두 동일하게 적용 :
  • 튜플은 괄호를 이용하여 t = (1, 2, 3)과 같은 형태로 선언
  • 리스트와 같은 개념이지만 값을 변경하는 것이 불가능한 리스트로 이해하면 된다. 튜플은 선언과 사용이 리스트와 약간 다르다.
  • 세트 (set)수학의 집합과 개념적으로 아주 비슷파이썬에서는 세트 선언을 하는 것으로 사용 할 수 있다.set() 함수를 사용하여 리스트나 튜플의 데이터를 넣으면 해당 값이 세트 형태로 변환된다.세트는 튜플과 다르게 삭제나 변경이 가능하다.세트를 지원하는 함수에는 원소 하나를 추가하는 add(),새로운 리스트를 그대로 추가하는 update(), 모든 변수를 지우는 clear() 등이 있다. 값은 모두 순서 없이 저장되는 동시에 중복을 제거하고 저장된다.
    • 합집합은 두 집합의 중복값을 제거하고 합치는 연산
    s1.union(s2) 를 통해 s1과 s2의 합집합이 출력된다. 합집합은 union()과 같은 함수로도 표현할 수 있지만, | 기호로도 추출할수 있다. (s1 | s2의 결과가 s1.union(s2)와 동일)
    • 교집합은 두 집합 양쪽에 모두 포함된 값만 추출하는 연산
    s1과 s2는 모두 3, 4, 5를 원소로 가지고 있다. 이 경우, s1.intersection(s2)나 s1 & s2로 교집합을 추출할 수 있다. (교집합의 개념은 if문에서 배웠던 and 조건의 개념과 비슷)
    • 차집합은 앞에 있는 집합 s1의 원소 중 s2에 포함된 원소를 제거하는 연산이다.
    즉, si에서 si 과 s2의 교집합 원소를 삭제하면 된다.
  • s1은 [1, 2, 3, 4, 5]를 가지고 있으므로 [3, 4, 5]를 제거하면 [1, 2]만 남는다. s1.difference(s2) 또는 s1 - s2로 차집합을 추출할 수 있다.
  • s1 =set([1, 2, 3, 4, 5]) s2 =set([3, 4, 5, 6 ,7]) s1.union(s2) # s1과 s2의 합집합 # {1, 2, 3, 4, 5, 6, 7} s1| s2 #set([1,2,3,4,5,6,7]) # {1, 2, 3, 4, 5, 6, 7} s1.intersection(s2) # s1과 s2의 교집합 # {3, 4, 5} si & s2 # set([3, 4, 5]) # {3, 4, 5} s1.difference(s2) #s1과 s2의 차집합 # {1, 2} s1 - s2 # set([1, 2]) # {1, 2}
  • 파이썬의 세트는 수학의 집합과 마찬가지로 다양한 집합 연산을 제공한다. 집합 연산에는 교집합, 합집합, 차집합이 있다.
  • 원소 하나를 제거하는 remove() 또는 discard(),
  • s # {1, 2, 3} s.add(1) # 1을 추가하는 명령이지만 중복 불허로 추가되지 않음 s # {1, 2, 3} s.remove(1) # 1 삭제 s # {2, 3} s.update([1, 4, 5, 6, 7]) # [1, 4, 5, 6, 7] 추가 s # {1, 2, 3, 4, 5, 6, 7} s.discard(3) #3 삭제 s # {1, 2, 4, 5, 6, 7} s.clear() # 모든 원소 삭제 s # set()
  • [1, 2, 3, 1, 2, 3] (리스트형)을 세트로 변환하면, 중복을 제거한 후 {1, 2, 3}으로 변환되어 출력
  • s=set([1,2,3,1,2,3]) # set()함수를 사용하여 1,2,3을 세트 객체로 생성 s # {1, 2, 3}
  • 중복을 불허하는 특징 때문에 프로그래밍에서 매우 유용하다. 대표적으로 문서 하나에 들어가 있는 단어 종류의 개수를 셀 때 모든 단어를 추출한 후 세트로 변환하면 단어 종류의 개수를 쉽게 파악할 수 있다.
  • 값을 순서 없이 저장하되 중복을 불허하는 자료형

딕셔너리

  • 딕셔너리(Dictionary)의 개념데이터의 유일한 구분자인 키 (key)라는 이름으로 검색할 수 있게 하고,
  • 실제 데이터를 값(value)이라는 이름과 쌍으로 저장하여 프로그래머가 데이터를 쉽게 찾을 수 있도록 한다
  • 파이썬의 딕셔너리 구조는
  • 파이썬에서의 딕셔너리
    • 딕셔너리 선언
    중괄호를 사용하여 키와 값을 쌍으로 구성여기서 중요한 것은 값에 다양한 자료형이 들어갈 수 있다는 것 리스트와 같이 한 번에 여러 데이터를 입력한다거나, 튜플, 세트와 같은 데이터도 사용할 수 있다.
    • 사용 예
    학번(키)이름(값)
    2020111753 Jiyoung
    202111175 Jaeyeon
    202211175 Jihyeon
    202311175 Jeongyeon
    student_info = (2020111753:'Jiyoung', 2021111753:'Jaeyeon', 2022111753:'Jihyeon', 2023111753:'Jeongyeon'}
    
    student_info라는 변수를 먼저 선언한 후, 해당 변수에 (키:값) 형태로 값을 입력
    • 값 호출하기
    student_info 딕셔너리에서 특정한 값만 호출해당 값의 키를 대괄호 안에 넣어 호출 키는 문자열로 선언할 수도 있고. 정수형으로 선언할 수도 있다.
    • 재할당과 데이터 추가하기
    student_info[2023111753] = 'Jiwon'
    student_info[2023111753]
    #'Jiwon'
    student_info[2019111753] = 'Jaehyeon'
    student_info
    # {2020111753:'Jiyoung', 2021111753:'Jaeyeon', 2022111753:'Jihyeon', 2023111753:'Jiwon', 2019111753:'Jaehyeon'}
    
    딕셔너리에서의 재할당도 리스트에서 사용하는 방식과 다르지 않다. 키를 이용하여 해당 변수를 호출한 후 새로운 값을 할당하면 된다. 데이터 추가도 새로운 키를 사용하여 값을 할당하면 됨
  • 할당 시 기존에 있던 키라면 해당 값이 변경되고, 기존에 없던 키라면 새로운 값으로 추가된다.
  • 여기서는 정수형으로 선언했으므로 정수형으로 호출 ⚠️ 변수의 자료형을 정확히 모르고 호출한다면 리스트로 오해할 수도 있음
  • student_info[2022111753] # 'Jihyeon'
  • 심지어 딕셔너리 또한 사용할 수 있다.
  • 딕셔너리 변수 = {키 1:값 1, 키 2:값 2, 키 3:값 3, …}
  • 딕셔너리 함수
    country_code = {} # 딕셔너리 생성
    country_code = {"America":1, "Korea":82, "China":86, "Japan":81}
    country_code
    # {'America':1, 'Korea':82, 'China':86, 'Japan':81}
    
    • keys() 함수 딕셔너리의 키만 출력할 때는 keys() 함수 사용 이 함수를 사용하면 키가 리스트 형태로 출력된다.
    country_code.keys() # 딕셔너리의 키만 출력
    # dict_keys(['America', 'Korea', 'China', 'Japan'])
    
    • values() 함수 반대로 딕셔너리의 값만 출력할 때는 values() 함수를 사용합니다
    country_code["German"] = 49 # 딕셔너리 추가
    country code
    # {'America': 1, 'Korea': 82, 'China': 86, 'Japan': 81, 'German': 49}
    country_code.values() # 딕셔너리의 값만 출력
    # dict_values([1, 82, 86, 81, 49])
    
    • items() 함수 키-값 쌍을 모두 보여줄 때는 items() 함수를 사용합니다
    country_code.items() # 딕셔너리 데이터 출력
    # dict_items([('America', 1), ('Korea', 82), ('China', 86), ('Japan', 81), ('German', 49)])
    
  • 국가명과 국가 전화번호를 묶어 보여주는 코드 작성

collection 모듈

from collections import deque
from collections import OrderedDict
from collections import defaultdict
from collections import Counter
from collections import namedtuple
  • deque 모듈먼저, append() 함수를 사용하면 기존 리스트처럼 데이터가 인덱스 번호를 늘리면서 쌓이기 시작deque_list.pop()을 수행시키면 오른쪽 요소부터 하나씩 추출된다. 스택처럼 나중에 넣은 값부터 하나씩 추출deque에서 큐 사용 pop(0)을 입력하면 실행될 것 같지만, deque에서는 작동 x
    from collections import deque
    
    deque_list = deque()
    for i in range(5):
    ... deque_list.appendleft(i)
    ...
    print(deque_list)
    # deque([4, 3, 2, 1, 0])
    
    • deque 모듈의 장점
      • 연결 리스트의 특성을 지원 연결 리스트는 데이터를 저장할 때 요소의 값을 한 쪽으로 연결한 후, 요소의 다음 값의 주소값을 저장하여 데이터를 연결하는 기법이다.
      • 기존의 리스트에서 지원하는 함수 사용 가능
      • 메모리의 효율적 사용과 빠른 속도라는 측면에서 유용
  • appendleft() 함수로 새로운 값을 왼쪽부터 입력하도록 하여 먼저 들어간 값부터 출력될 수 있도록 한다.
  • deque_list.pop() # 4 deque_list.pop() # 3 deque_list.pop() # 2 deque_list # deque([0, 1])
  • from collections import deque deque_list = deque() for i in range(5): ... deque_list.append(i) ... print(deque_list) # deque([0, 1, 2, 3, 4])
  • deque 모듈은 스택과 큐를 모두 지원하는 모듈 deque를 사용하기 위해서는 리스트와 비슷한 형식으로 데이터를 저장해야 한다.
  • OrderedDict 모듈
    d = {}
    d['x'] = 100
    d['l'] = 500
    d['y'] = 200
    d['z'] = 300
    for k, v in d.items():
        print(k, v)
    
    # x 100
    # l 500
    # y 200
    # z 300
    
    결과는 컴퓨터마다 다를 수 있음
    from collections import OrderedDict
    d = OrderedDict()
    d['x'] = 100
    d['y'] = 200
    d['z'] = 300
    d['l'] = 500
    for k, v in d.items():
        print(k, v)
    
    # x 100
    # y 200
    # z 300
    # l 500
    
    키를 이용하여 주민등록번호를 번호 순서대로 정렬한 후 데이터를 출력하는 경우와 같이 딕셔너리로 데이터 처리 시 키나 값으로 데이터를 정렬할 때 가장 많이 사용
  • x, l, y, z의 순서대로 키를 저장했지만, 결과는 저장한 순서와 상관없이 다양한 형태로 출력 하지만 OrderedDict 모듈은 키의 순서를 보장한다.
  • 이름 그대로 순서를 가진 딕셔너리 객체
  • defaultdict 모듈
    d = dict()
    print(d["first"])
    
    실제 딕셔너리에서는 키를 생성하지 않고 해당 키의 값을 호출하려고 할 때, 오류가 발생한다.
    from collections import defaultdict
    
    d = defaultdict(lambda: 0)
    print(d["first"])
    # 0
    
    d = defaultdict(lambda: 0) : defaultdict 모듈을 선언하면서 동시에 초깃값을 0으로 설정한 것이는 어떤 키가 들어오더라도 처음 값은 전부 0으로 설정한다는 뜻. 이외에도 defaultdict의 초깃값은 리스트 형태로도 설정할 수 있다.s 변수에 튜플 데이터들을 이차원 리스트 형태로 저장했다.이는 일반적인 ‘dict’에 비해 코드 수를 줄일 수 있어 defaultdict 타입의 가장 큰 장점
  • 또한 d =defaultdict(list) 코드는 d를 defaultdict 타입으로 선언하면서 초깃값을 리스트로 선언 5행부터 for문이 작동하여, 변수 s의 각 요소에서 키 값과 실제 값을 추출하여 변수 시에 추가 중요한 것은 변수 d는 deafultdict 타입이면서 list가 초깃값으로 선언되었기 때문에 새로운 키 값이 없더라도 별도로 오류가 발생하지 않는다.
  • from collections import defaultdict s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] d = defaultdict(list) for k, v in s: d[k].append(v) print(d.items()) [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] # dict_items([('yellow', [1, 3]), ('blue', [2, 4]), ('red', [1])])
  • lambda() 함수를 배우지 않아 코드를 정확히 이해하기 어렵겠지만 ‘return 0’이라고 이해하면 됨
  • 즉, first의 키값을 별도로 생성하지 않은 채 바로 호출하여 오류가 발생하는 것
  • 딕셔너리의 변수를 생성할 때 키에 기본값을 지정하는 방법 새로운 키를 생성할 때 별다른 조치 없이 새로운 값을 생성할 수 있다.
  • Counter 모듈즉, 리스트나 문자열과 같은 시퀀스 자료형에 저장된 요소 중 같은 값이 몇 개 있는지 그 개수를 반환기존 문자열값인 ‘gallahad’를 리스트형으로 변환한 후, text 변수에 저장 사실 ‘gallahad’ 자체도 시퀀스 자료형인 문자열이므로 굳이 리스트로 변환할 필요는 없음Counter를 이용하면 각 문자의 개수 세는 작업을 매우 쉽게 할 수 있다.
    text = """A press release is the quickest and easiest way to get free
    publicity. If well written, a press release can result in multiple published
    articles about your firm and its products. And that can mean new prospects
    contacting you asking you to sell to them.""".lower().split()
    Counter(text)
    # Counter({'and': 3, 'to': 3, 'a': 2, 'press': 2, 'release': 2, 'can': 2,'you': 2, 'is': 1, 'the': 1, 'quickest': 1, 'easiest': 1, 'way': 1, 'get': 1,'free': 1, 'publicity.': 1, 'if': 1, 'well': 1, 'written,': 1, 'result': 1,'in': 1, 'multiple': 1, 'published': 1, 'articles': 1, 'about': 1, 'your': 1,'firm': 1, 'its': 1, 'products.': 1, 'that': 1, 'mean': 1, 'new': 1,'prospects': 1, 'contacting': 1, 'asking': 1, 'sell': 1, 'them.': 1})
    
    Counter는 단순히 시퀀스 자료형의 데이터를 세는 역할도 하지만, 딕셔너리 형태나 키워드 형태의 매개변수를 사용하여 Counter를 생성할 수도 있다.
    • 딕셔너리 형태로 Counter 객체를 생성하는 방법
    from collections import Counter
    
    c = Counter({'red': 4, 'blue': 2})
    print(c)
    # Counter({'red': 4, 'blue': 2})
    print(list(c.elements()))
    # ['red', 'red', 'red', 'red', 'blue', 'blue']
    
    {'red': 4, 'blue': 2}라는 초깃값을 사용하여 Counter를 생성 elements() 함수를 사용하여 각 요소의 개수만큼 리스트형의 결과를 출력
    • 키워드 형태의 매개변수를 사용하여 Counter를 생성하는 방법
    from collections import Counter
    
    c = Counter(cats = 4, dogs = 8)
    print(c)
    # Counter({'dogs': 8, 'cats': 4})
    print(list(c.elements()))
    # ['cats', 'cats', 'cats', 'cats', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs','dogs', 'dogs', 'dogs']
    
    매개변수의 이름을 키로, 실제 값을 값으로 하여 Counter를 생성
    • Counter는 기본 사칙연산 지원 파이썬에서 지원하는 기본 연산인 덧셈, 뺄셈, 논리 연산 등이 가능하다.
    from collections import Counter
    
    c = Counter(a = 4, b = 2, c = 0, d = -2)
    d = Counter(a = 1, b = 2, c = 3, d = 4)
    c.subtract(d)          # c - d
    c
    # Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
    
    2개의 Counter c와 d를 생성한 후 c.subtract(d)를 수행하여 c에 대한 d의 차를 구한 결과 : c에 있는 각 요소의 개수가 d에 있는 요소의 개수만큼 감소
    • 기호는 두 Counter 객체에 있는 각 요소를 더한 것이고, & 기호는 두 객체에 같은 값이 있을 때, 즉 교집합의 경우에만 출력 반대로 I 기호는 두 Counter 객체에서 하나가 포함되어 있다면, 그리고 좀 더 큰 값이 있다면, 그 값으로 합집합을 적용
  • from collections import Counter c = Counter(a = 4, b = 2, c = 0, d = -2) d = Counter(a = 1, b = 2, c = 3, d = 4) print(c + d) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2}) print(c & d) # Counter({'b': 2, 'a': 1}) print(c | d) # Counter({'a': 4, 'd': 4, 'c': 3, 'b': 2})
  • 정렬까지 끝낸 결과물 확인
  • 다음으로 c라는 Counter 객체를 생성하면서 text 변수를 초깃값으로 설정 이를 출력하면 각 알파벳이 몇 개씩 있는지 쉽게 확인할 수 있다. 그리고 c["a"]처럼 딕셔너리 형태의 문법을 그대로 이용해 특정 텍스트의 개수도 바로 출력
  • from collections import Counter text = list("gallahad") text # ['g', 'a', 'l', 'l', 'a', 'h', 'a', 'd'] c = Counter(text) c # Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1}) c["a"] # 3
  • Counter 모듈은 시퀀스 자료형의 데이터 값의 개수를 딕셔너리 형태로 반환하는 방법
  • namedtuple 모듈
    from collections import namedtuple
    
    Point = namedtuple('Point', ['x', 'y'])
    # 좌표 평면에서의 점의 위치를 표현하기 위해 Point라는 객체를 생성하여 값을 저장한 namedtuple
    p = Point(11, y=22)
    P
    # Point(x=11, y=22)
    p.x, p.y
    # (11, 22)
    print(p[0] + p[1])
    # 33
    
    Point = namedtuple(’Point', ['x', 'y']) 코드에서 Point 객체의 이름은 Point로 지정하고, 저장되는 요소의 이름을 x와 y로 지정한다.
    • p 변수에 저장된 값을 호출하는 방법
  • 다음으로 Point 객체를 생성한다. (생성은 함수와 비슷하다.) Point 객체에서x와 y를 변수로 사용하고 있고 각각 p = Point(11, y=22)에서 차례로 사용되어 값을 저장할 수 있다. 입력된 값은 p 변수에 저장한다.
  • 튜플의 형태로 데이터 구조체를 저장하는 방법