4 분 소요

1.Python Data Structure

파이썬 자료구조

ㄴ 어떤 데이터를 저장할 때 효율적으로 정리하기 위한 데이터의 저장 및 표현 방식

Stack

나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리

LIFO(Last In First Out)

입력 : Push 라고함 append() 사용

출력: Pop 라고함 pop() 사용

Queue

먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리

FIFO(First in First out)

입력 : Put 라고함 append() 사용

출력: Get 라고함 pop(0) 사용

Tuple

값의 변경이 불가능한 리스트

선언시 ( ) 사용

ㄴ 변경되지 않을 데이터 저장(학번, 이름, 우편번호 등등)

ㄴ 함수의 반환등 사용자의 실수에 의한 에러 방지

*값이 하나인 tuple은 반드시 “,”를 붙여야함

Set

값을 순서없이 저장, 중복 불허 하는 자료형

선언시 { } 사용

쉽게 집합이라고 생각하면 됨

#합집합
s1.union(s2)
s1 | s2
#교집합
s1.intersection(s2)
s1 & s2
#차집합
s1.difference(s2)
s1 - s2

Dict

구분을 위한 데이터 고유 값을 identifier 또는 key 라고 함

key와 value를 매칭

Hash Table이라는 용어를 사용하기도 함(다른 언어에서)

.keys()

.values()

로 각각 확인 가능

.items()

하면 key, value 값 둘다 출력

Collections

list, tuple, dict 에 대한 python built-in 모듈

from collections import deque
from collections import defaultdict

deque

Stack, Queue 지원하는 모듈

list 보다 효율적인 자료구조

#값 추가
deque_list.append(~)
#값 왼쪽에서 추가
deque_list.appendleft(~)
#리스트 전체 ~칸 만큼 회전
deque_list.rotate(~)
#리스트 붙이기
deque_list.extend([1,2,3])
deque_list.extendleft([1,2,3])

OrderedDict

넘어가도록 하자 (잘 안씀)

DefaultDict

dict type 값에 기본값을 지정, 신규값 생성시 사용하는 방법

일반적인 dict에서는 key 값이 dict에 없는데 출력하려하면 에러남. 이를 위해 초기값을 설정하는 것.

#초기값은 함수형태로 지정해 주어야 함
d = defaultdict(lambda : 0)
#ex2
def default_value():
  return 0
d = defaultdict(default_value)

text-mining 접근법 - Vector space model 에서 사용될 수 있다.

Counter

sequence type의 data element 갯수를 dict 형태로 변환

a_list = ["b","b","c","b"]
c= Counter(a_list)
set 연산들을 지원함 (&, , + , - )

namedtuple

tuple 형태로 data 구조체를 저장하는 방법

저장되는 data의 variable을 사전에 지정해서 저장함

2.Pythonic Code

  • split & join
  • list comprehension
  • enumerate &zip
  • lambda & map& reduce
  • generator
  • asterisk

ㄴ 남 코드에 대한 이해도 / 효율 / 간지 를 위한 챕터

## split 함수

string type 값을 ‘기준값’으로 나눠서 list 형태로 변환

#문자열 list로 나누기
items = "one two three"
items.split()
# items.split(" ")

# 사이사이에 빈칸 첨부하여 문자열로 만들기
" ".join(colors)

list comprehension

기존 List 사용하여 간단히 다른 list 만드는 기법

한 줄로 표현하는 거

#ex1
array = [i for i in range(10)]
#ex2 filter 추가
array2 = [i for i in range(10) if i % 2 == 0]
#ex3
array3 =[i+j for i in case_1 for j in case_2 if not(i==j)]
#ex4 else도 가능
array3 =[i+j for i in case_1 for j in case_2 if not(i==j) else "SAME"]
# ex5 - 2D로 쓰는 방법
array4 = [[i+j for i in case_1] for j in case_2]

Enumerate & zip

enumerate : 순서가 앞에서 같이 추출

{i : v for i, v in enumerate(set_text)}
'''
(output)
0 : 'in'
1 : 'group'
2 : 'my'
'''

zip : 두 개의 list 값을 병렬적으로 추출

#array type output
[[a, b] for a, b in zip(alist, blist) ]
#tuple type output
[c for c in zip(alist, blist)]

lambda

lambda : 이름 없이 쓸 수 있는 익명함수

#ex1
(lambda x, y : x+y)(10, 50)
'''
output  : 60
'''

#ex2
up_low = lambda x : x.upper() + x.lower() 
up_low("what")
'''
output : 'WHATwhat'
'''

#ex3
ans = lambda x: "-".join(x.split())
ans("I come")
'''
I-come
'''

lambda 함수는 권장하지 않으나 여전히 많이 쓰이는 추세

ㄴ 문법 어려움

ㄴ 테스트하기 어려움

ㄴ 코드 해석하기 어려움

map

함수를 리스트에 각각 적용하는거

ex = [1,2,3,4,5]
f = lambda x: x**2

list(map(f, ex))

'''
(output)
[1,4,9,16,25]
'''

ㄴ 단점 : 사용자가 이해하기 어렵다.

-> map 대신에 list comprehension 권장

(근데 아직도 매우 많이 쓰임)

reduce

list에 똑같은 함수를 적용해서 통합

from functools import reduce\

reduce(lambda x , y : x+y , [1,2,3,4,5])

iterable object

sequence 형 자료형에서 데이터를 순서대로 추출하는 Object

generator object

iterable object 를 특수한 형태로 사용하는 함수

element 가 사용되는 시점에 값을 메모리에 반환

yield를 사용해 한번에 하나의 element만 반환함

def generator_list(value):
  result = []
  for i in range(value):
    yield i

막상 써보면 일반 함수랑 같아 보이지만

평소에는 메모리 주소만 가지고 호출을 할 때 값이 프린트가 되기 때문에

메모리 주소를 아낀다고 한다.

generator comprehension

list comprehension과 비슷하지만

[ ] 대신에 ( ) 사용함

  • list 타입 데이터 반환 함수는 generator 사용!
  • 큰 데이터 처리할 때 generator expression 고려!
  • 파일 데이터 처리할 때도 generator!

Function passing arguments

1) keyword arguments

함수에 대한 parameter를 변수명으로 사용 , arguments를 넘김

def printing(myname, yourname, lastname):
  print(myname, yourname, lastname)
  
printing(lastname = "abs", myname = "hwang", yourname = "bark")
  1. default arguments

parameter의 기본값 사용 (입력하지 않은 경우 출력)

variable length asterisk

variable length : 가변인자

ㄴ 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법

asterisk : (*) 기호

입력된 값은 tuple형태로 사용

일반적으로 *args를 변수명으로 사용

def test(a, b, *args):
  print(list(args))
  print(type(arge))
  
test(1,2,3,4,5)

'''
(output)
[3,4,5]
<class 'tuple'>
'''

keyword variable-length

:키워드 가변인자

parameter 이름을 지정하지 않고 입력하는 방법

asterisk(*) 두개 사용하여 함수 parameter표시

입력된 값은 dict type으로 사용

def test2(**kwargs):
  print(kwargs)
  print(type(kwargs))
  
test2(first = 3, second = 4, third =5 )
'''
(output)
{"first" :3, "second" :4, "third" :5 }
<class "dict">
'''

참고로, 함수에 keyword로 넣기 시작하면 그 뒤로는 계속 keyword로 넣어줘야 함.

asterisk - unpacking a container

asterisk(*) 앞에 붙이면

자료형에 들어가 있는 값을 unpacking 한다.

함수값, zip 등에 유용하게 사용가능

def aster(a, *args):
  #unpack된 형태
  print(a, args)
  #원래 기존 pack 된 형태
  print(a, *args)
data = ([1,2],[3,4],[5,6])
print(*data)

Keyword unpacking - 별표 두개 (**)

ㄴ dict 풀어줄 때 사용

카테고리:

업데이트:

댓글남기기