이 페이지는 네이버커넥티드의 최성철 교수님의 교육자료를 참고했습니다.
1. Python Data Structure(데이터 구조)란?
자료구조는 어떤 데이터를 저장할 때, 그 데이터에 특징에 따라 컴퓨터에 효율적으로 정리하기 위한 데이터의 저장 및 표현 방식 이야기함. 일반적으로 사용되는 정수, 문자열등의 변수 타입보다는 이러한 특징들에 잘 맞는 형태로 데이터를 저장하게 된다면 훨씬 효율적으로 컴퓨터의 메모리를 사용하고, 프로그래머가 코드를 작성하기에도 용이하게 해줍니다.
정말정말정말 중요한 내용들이 많은 챕터로 세심하게 또 세심하게 이해하고 넘어가면 좋겠습니다.
특징이 잇는 정보는 어떻게 저장하면 좋을까?
데이터 구조 생각해보기
- 전화번호부 정보는 어떻게 저장하면 좋을까?
- 은행 번호표 정보는 어떻게 처리하면 좋을까?
- 서적 정보는 어떻게 관리하면 좋을까?
- 창고에 쌓인 수화물의 위치를 역순으로 찾을 때?
파이썬 기본 데이터 구조
1. 스택과 큐(stack & queue with list)
스택
- 나중에 넣은 데이터를 먼저 반환
- append(), pop()으로 사용이 된다. (pop 함수 실행시 리턴값에는, 배열에서 나오는 값이 반환됨 알면 좋음.)
큐
- 가장 먼저 입력된게 가장 먼저 반환
- append(), pop(0) 으로 사용하면됨.
2. 튜플과 집합(tuple & set)
튜플
- 값의 변경이 불가능한 리스트
- 선언 시 "[]"가 아닌 "(1,)" 을 사용(반드시 괄호 안에 콤마가 있어야 튜플로인식)
- 리스트의 연산, 인덱싱, 슬라이싱 등은 동일하게 사용
왜 쓸까?
학번, 이름 우편번호 등등. 바꾸면 안되는 정보를 저장하고 주의해서 다루기 위해 사용
집합
- 값을 순서없이 저장, 중복 불허 하는 자료형
- set 객체 선언을 이용하여 객체생성
- 배열에서 중복된 값을 하나로 만들어줌 [1,1,2,3,3] -> [1,2,3]
- 선언시 set([1,2,3])이런식이나, {1,2,3}이 런식도 가능
- add, remove, update, discard, clear의 함수등이 있음
- 수학에서 활용하는 다양한 집합기능 사용가능.
- 집합끼리는 합집합(union, |), 교집합(intersection, &), 차집합(difference, -) 을 지원함. (둘다 사용가능)
3. 사전(dictionary)
사전
- 데이터를 저장할떄 구분 지을수 잇는 값을 함께 저장(주민번호, 제품 번호)
- 구분을 위한 고유값을 identifier 또는 key라고 함.
- 선언시 {21325214: '이호용', 21345734: '이원우'} 또는 {} 또는 dict() 가능
- dict에는 키나, 벨류값만 뽑아 볼수도 있고, 키나 벨류에 in을 써서 들어있는지 아닌지도 확인할수 잇따.
- 구조체랑 비슷함...
vscode rainbow csv모듈 다운
4. Collection 모듈
1. deque
- list에 비해 빠른 효율적
- 스택과 큐 지원하는 모듈
- 값들이 순차적인 배열로 연결되지 않고, 사진 처럼 linked list로 연결 되어잇다.
- 링크를 끊고 원하는 주소와 다시 연결할수 잇다.
- 리스트에서 사용 가능한건 다 사용가능하고 몇가지 기능들이 더 잇다.
- append도 지워되고 leftappend도 지원, expend 도 leftexpend지원
- 리스트 배열보다, deque를 사용하면 똑같이 append와 pop을 사용해도 훨씬 빠르게 실행된다.(%timeit general_list() 이 함수로 시간을 재어볼수 있다. 몰라도됨.)

2. orderedDit
- defaultdict : dict에 만약 key가 없는 값을 입력하면 원하지 않는 값이 나올수 잇는데, 이를 처리하기위해, defaultdict를 사용하면, 입력되지 않는 값은 하나의 값으로 나오게 할수 잇음.
- counter : sequence type의 data element들의 갯수를 dict형태로 반환, 리스트 잇으면, counter[배열 넣기] 실행하면, 딕트 형태로 키값이 똑같은게 몇개잇는지 반환한다.
(element : counter해서 dict로 바꾼 배열을 list(c.element()) 하면 dict 밸류값에 맞게 key를 생성해서 1차 배열로 나열함.)
- namedtubple : 구조체 처럼 선언하는데, 자료형이 튜플로 저장이된다. 그안의 값들을 사용할 수 잇다. 아래 코드로 보는게 더 이해하기 쉬운거 같다.

2. Pythonic code 란?
pythonic code는 파이썬 특유 문법을 의미 합니다.
앞서 우리는 파이썬의 가장 큰 장점 중 하나가 인간이 이해하고 쓰기 쉬운 언어라고 이야기를 했습니다. 파이썬의 이러한 특징을 가장 잘 살린 파이썬의 문법적 특징을 우리는 pythonic code라고 합니다.
pythonic code 는 앞서 우리가 살펴보았던 데이터 구조와 달리 특별히 모듈이나 함수가 존재하는 것은 아닙니다. 단지 앞에서 배운 str 이나 다양한 모듈들을 활용하여 파이썬 특유의 문법을 표현하는 것입니다. 파이썬 문법의 가장 큰 특징은 '짧고 이해하기 편하다'는 것 입니다. 코드의 수를 줄여서 비록 컴퓨터의 시간은 증가할 수 있지만, 사람의 시간은 아낄 수 있다는 장점이 있습니다.
추가적으로 python 2.x 버전에서 많이 썼던 lambda, map, reduce 와 난이도가 있는 파이썬 코딩을 위해 반드시 필요한 asterisk 의 활용에 대해서 배우도록 하겠습니다.
예전엔 파이썬 만의 느낌 나는 코드가 잇엇는데, 요즘은 다른 언어들도 파이썬과 비슷한 문법으로 바뀌어 pythonic code의 의미가 희석되고 있다고 합니다.
쓰는 이유, 남의 코드에 대한 이해도 증가
Contents
- split & join
- list comprehension
- enumerate & zip
- lambda & map & reduce
- generator
- asterisk
1. split & join
- 머신러닝 및 데이터 처리에서 이게 핵심이 아닐까?... 파이썬 2일차의 생각...
- split, join만 배우면 다배운거 아냐?...(농담입니다.)
2. list comprehension
- 대표적인 예 result = [i for i in range (10)]
- 기존 List 사용하여 간단히 다른 List를 만드는 기법
- 포괄적인 List, 포함되는 리스트라는 의미로 사용됨
- 파이썬에서 가장 많이 사용되는 기법 중 하나
- 일반적으로 for + append 보다 속도가 빠름

- 원래는 append써서 3줄의 코드를 입력해야하지만, 파이썬은 한줄로 배열을 생성할수 있다.. (신세계;)
- 뒤에 조건을 넣어서 원하는 값들만, 배열에 넣을수 도 있음.
-
for 구문을 두개 넣을수도 있다.

-
원하는 값만 넣게 for구문 뒤에 조건을 넣을 수도 잇다.

-
와 이런식으로 2중배열을 만들수도 있다.
-
신세계다.. 신세계; 이걸 c로 짤려면, 얼마나 삽질을 해야할까.


-
for구분을 두개 사용해서 만들떄, 괄호에 따라서 for의 구동 순서가 바뀐다.
오늘은 정말 다 중요한 내용들이다. 여러번 보자.
3. enumerate
- 열거하다는 뜻
- list의 element를 추출할 때 번호를 붙여서 춫룰
- for i, v in enumerate("ABC"):
- 이런 형태라면, 0 A , 1 B, 2 C 순차적으로 나옴
- {v : i for i, v in enumerate("ABC")}
- 이러면 dict타입으로 나와짐.
4. zip
- 두개의 list의 값을 병렬적으로 추출함. (사진에서 a1, b1추출 해서 values에 넣음)
- enumeraate & zip 활용하면 좀더 편리하게 사용가능함.
array1 = ["a1","a2","a3"] , array2 = ["b1","b2","b3"]
list(enumerate(lis(zip(array1.array2))))
[(0, ('a1', 'b1')), (1,('a2','b2')), (2,('a3', 'b3'))]
zip에서 배열1,2를 인덳스에 따라 묵어주고 그렇게 만든 값 주소를 반환한다
그 주소 값을 리스트로 만들어 보이게 해주고, enumerate로 번호를 매기고, 리스트로 만들어줫다.

5. lambda & map & reduce
1. lamdbda
-
함수 이름없이 함수 처럼 쓸수 있는 익명함수
-
이런형태로 쓴다는데, 이제 기가찬다.
-
다행이 python3 부터는 권장하지는 않는다, 그래도 많이 쓰는 편이니 눈에는 익히자.


2. map
-
예전에 써본 기억이 있다. 아마 c에서
-
map이 사용자가 쓰기에 불편한 감이 있어 안쓰길 권장하지만, 여전히 많이 사용함. 눈에 익히자.
-
배열의 0부터 끝까지, f(x)함수에 x값에 입력이 되며 함수가 실행된다.

-
아래방법 처럼 map대신 가독성 있게 코드를 짤수 있어서 map을 안쓰길 권장한다고 한다

3. reduce
-
from functools import reduce 사용하고 쓰자.
-
알아보고 채우기..다시
6. iterable object
- 시퀀스형 데이터에서는 데이터를 for a in ["1","2","3"] 이런식으로 순차적으로 추출하는 object엿다. 이런걸 이터러블 오브젝트라고 한다.
- 내부적 구현으로 iter와 next가 사용됨
- iterable을 배우는 이유는 generator을 배우기 위해 쓴다.
- iter(배열) 로 만들면, 링크드 리스트랑 개념이 비슷한거 같은데? 다른점이 뭐지...?

generator (까먹고 generator은 안했네;)
- iterable objec를 특수한 형태로 사용해주는 함수
- element가 사용되는 시점에 값을 메모리에 변환
- generator은 아래사진처럼 사용이 되는데,
- geneartor list함수는 for a in geneartor_list 함수가 끝나기 전까지 살아있으며,
- print(a)가 실행 될떄 마다, geneartor_list함수의 yield에서 메모리 주소값을 a로 던져준다. 그래서 메모리 주소값을 사용안한다고 한다.
- 아직 와닿지 않는다. 다시보자..

7.funtion passing arguments
8. variable-length asterisk (가변길이)
- 함수의 파라메터가 정해져있지 않다면, 다항 방정식?? 마트 물건 계산함수?
1. 가변인자
-
개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법
-
Keyword arguments와 함께, argument 추가가 가능
-
Asterisk(*) 기호를 사용하여 함수의 parameter를 표시함
-
입력된 값은 tuple type으로 사용할 수 있음
-
가변인자는 오직 한 개만 맨 마지막 parameter 위치에 사용가능
-
*args 사용해서 남는 가변인자를 args에 배열형태로 저장. (c에서 argv랑 비슷함)
2. 키워드 가변인자
-
가변인자 *args랑 비슷한데, 키워드 가변인자는 **kargs 형태로 사용된다.
-
**kargs를 사용하면 dict 형태로 입력된다.
3. asterisk
-
흔히 알고 있는 *을 의미함
-
단순 곱셈, 제곱, 가변인자 등 다른데도 사용
-
대표적으로 unpaking a container
-
unpaking a container : 함수를 사용할떄 *을 넣어서 매게변수 입력이 가능한데, *를 넣으면 튜플을 풀어서 사용가능하다. 안녛으면 튜플은 그냥 튜플로사용
-
사진 보면 print 문에 들어간 배열이 언페킹 일어나며 풀려서 출력


학습 후기.
- 자료형을 정리하지 못하면 빅데이터를 처리할때 문제가 많이 발생할거라 생각이 들었다.
- 데이터처리를 할일이 있는 사람이라면, 이번 장을 보고 또 보고 또 보며, 어떤 상황에 어떤 자료형을 쓸지 확실하게 숙지하는게 좋을거 같다.
- **보고~,또 보고~, 또또 보고! ,또또또 보고~!
아 알고리즘도 풀어야하는데, c알고리즘이라면, 그냥 어떻게 보고 훝고 넘어가면되고, 파이썬 알고리즘이라면, 직접 짜보며 배운것들이 정상적으로 작동하는지 테스트 해보자.