- 파이썬에서 많이 사용되는 자료구조에 대해서 배운다
- 자료구조는 어떤 데이터를 저장할 때, 그 데이터에 특징에 따라 컴퓨터에 효율적으로 정리하기 위한 데이터의 저장 및 표현 방식을 이야기한다
- 어떤 데이터는 순서가 있다거나, 그 데이터의 나타내는 ID 값과 쌍으로 이룬다던가 하는 등의 특징이 나타나게 된다
- 일반적으로 사용되는 정수, 문자열등의 변수 타입보다는 이러한 특징들에 잘 맞는 형태로 데이터를 저장하게 된다면 훨씬 효율적으로 컴퓨터의 메모리를 사용하고, 프로그래머가 코드를 작성하기에도 용이하게 해준다.
나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
Last In First Out (LIFO)
Data의 입력을 Push, 출력을 Pop이라고 한다
리스트를 사용하여 스택 구조를 구현 가능
Push를 append(), pop 을 pop()을 사용
스택 example
word = input('input a word: ')
word_list = list(word)
for i in range(len(word_list)):
print(word_list.pop())
장점 | 단점 |
---|---|
어느 위치에나 O(1)에 조회가 가능 | 한 번 생성한 배열은 크기 변경이 불가능 |
배열 시작 주소 + (원소 타임에 따른 byte 크기 * 원소 인덱스)로 해당 배열 원소 값의 주소 계산 및 메모리 접근이 가능 | 원소의 삭제나 삽입 등의 작업은 최악의 경우 O(n)의 시간복잡도를 갖는다 |
예를 들어 원소의 가장 첫번째 원소를 삭제한다고 가정하면 나머지 모든 원소를 하나씩 override해야 하므로 n-1개 만큼의 작업을 수행해야한다. |
동적 배열 메모리 구조
s = set([1,2,3,1,2,3]) # set 함수를 사용 1,2,3을 집합 객체 생성, a={1,2,3,4,5}도 가
s.add(1) # 한 원소 1만 추가, 추가, 중복불허로 추가 되지 않음
s.update([1,4,5,6,7]) # [1,4,5,6,7] 추가
s.discard(3) # 3 삭제
s.clear() # 모든 원소 삭제
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 # 또 다른 합집합 기호
s1.intersection(s2) # s1과 s2의 교집합 = {3,4,5} 출력
s1 & s2 # 또 다른 교집합 기호
s1.difference(s2) # s1과 s2의 차집합 = {1,2} 출력
s1 - s2 # 또 다른 차집합 기호
c = Counter({'red' : 4, 'blue' : 2}) # a new counter from a mapping
print(c) # Counter({'red' : 4, 'blue' : 2})
print(list(c.elements())) # {'blue', 'blue', 'red', 'red', 'red', 'red}
c = Counter(cats = 3, dogs = 2) # a new counter from keyword args
print(c) # Counter({'dogs': 2, 'cats' : 3})
print(c.elements())) # {'dogs','dogs','cats','cats','cats'}
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':3, 'b':0, 'c':-3, 'd':-6})
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})
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()
print(Counter(text))
print(Counter(text)['a'])
from collections import namedtuple
# basic example
Point = namedtuple('Point', ['x', 'y'])
print(Point) # __main__.Point
P = Point(x= 11, y=22)
print(p[0], p[1]) # (11, 22)
print(p) # Point(x=11, y=22)
print(p.x + p.y) # 33
- 파이썬 특유 문법을 의미하는 pythonic code에 대해 배운다.
- 앞서 우리는 파이썬의 가장 큰 장점 중 하나가 인간이 이해하고 쓰기 쉬운 언어라고 이야기를 했다.
- 파이썬의 이러한 특징을 가장 잘 살린 파이썬의 문법적 특징을 우리는 pythonic code라고 한다.
- pythonic code는 데이터 구조와 달리 특별히 모듈이나 함수가 존재하는 것이 아니다.
- 단지 앞에서 배운 str이나 다양한 모듈들을 활용하여 파이썬 특유의 문법을 표현하는 것이다.
- 파이썬 문법의 가장 큰 특징은 짧고 이해하기 편하다는 것이다.
- 코드의 수를 줄여서 비록 컴퓨터의 시간은 증가할 수 있지만, 사람의 시간은 아낄 수 있다는 장점이 있다.
- 추가적으로 python 2.x 버전에서 많이 썼던 lambda, map, reduce 와 난이도가 있는 파이썬 코딩을 위해 반드시 필요한 asterisk의 활용에 대해서 배운다.
word1 = ['a','b','c']
word2 = ['d','e','a']
result = [i + j for i in word1 for j in word2]
## result(one dimensional) same as ==
## for i in word1:
## for j in word2:
## result.append(i+j)
print(result) # ['ad', 'ae', 'aa', 'bd', 'be','ba'...ca]
result2 = [i + j for i in word1 for j in word2 if not(i==j)]
print(result) # ['ad','ae','bd','be','ba','cd','ce','ca']
word1 = ['a','b','c']
word2 = ['d','e','a']
## result(two dimensional) same as ==
## for j in word2:
## tmp = []
## for i in word2:
## tmp.append(i+j)
## result.append(tmp)
result = [[i+j for i in word1] for j in word2]
print(result) # [['ad','bd','cd'],['ae','be','ce'],['aa','ba','ca']]
# list의 있는 index와 값을 unpacking 하여 list로 저장
mylist = ['a','b','c','d'] # [(0,'a'), (1,'b'), (2,'c'), (3,'d')]
# General Funcion
def f(x,y):
return x+y
print(f(1,4)) # 5
# Lambda Function
f = lambda x, y : x + y
print(f(1,4)) # 5
a = [1,2,3]
b = [4,5,5]
res = list(map(lambda x,y : x + y if x == 1 or y == 5 else 'yay', a,b))
print(res) # [5, 7, 'yay']
from functools import reduce
print(reduce(lambda x,y : x+y, [1,2,3,4,5])) # 15
x = [1,2,3]
y = iter(x)
z = iter(x)
next(y) # 1
next(y) # 2
next(z) # 1
type(x) # <class 'list'>
type(y) # <class 'list_iterator'>
cities = ["Seoul", "Busan",
"Jeju"]
iter_obj = iter(cities)
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
next(iter_obj)
# 일반 리스트
def general_list(value):
result = []
for i in range(value):
result.append(i)
return result
# generator 리스트
def generator_list(value):
for i in range(value):
yield i
gen_ex = (n*n for n in range(500))
print(type(g))
why generator?
when generator?
precaution for generator
import sys
def gen_func(x):
for i in range(x):
yield i
print(sys.getsizeof(list(gen_func(10)))) # 152
print(sys.getsizeof([i for i in range(10)])) # 182
def print_something(my_name, your_name):
print("Hello {0}, My name is {1}".format(your_name, my_name))
print_something("Sungchul", "TEAMLAB") # Hello Sungchul, my name is TEAMLAB
print_something(your_name="TEAMLAB", my_name="Sungchul")
# Hello Sungchul, my name is TEAMLAB
def asterisk_test(a, b,*args):
return a+b+sum(args) # 1 + 2 + sum(3,4,5)
print(asterisk_test(1, 2, 3, 4, 5)) # 15
def kwargs_test_3(one,two,*args,**kwargs):
print(one+two+sum(args)) # 3 + 4 + sum(5,6,7,8,9)
print(kwargs) # (3,4,5)
kwargs_test_3(3,4,5,6,7,8,9, first=3, second=4, third=5)
ex = [[1,2],[3,4],[5,6],[7,8],[9,10]]
print(*ex) # [1, 2] [3, 4] [5, 6] [7, 8] [9, 10]
for value in zip(*ex):
print(value)
# (1, 3, 5, 7, 9)
# (2, 4, 6, 8, 10)