def bsearch(items, key):
# recursive function을 독립 시키기 위한 adapter function
return bs_helper(items, key, -1, len(items))
def bs_helper(items, key, lower, upper):
# Base condition : 값을 못 찾았을 경우
if lower + 1 == upper:
return None
mid = (lower + upper) // 2
# 값을 찾았을 경우 return
if key == items[mid]:
return mid
# 아래 쪽에 위치할 경우 lower range 를 검색
if key < items[mid]:
return bs_helper(items, key, lower, mid)
else:
return bs_helper(items, key, mid, upper)
a = [1, 2, 4, 5, 7, 9, 10, 34, 45, 89, 345]
print(bsearch(a, 5))
2018/07/16
[python] binary search tree
오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘이다. 처음 중간의 값을 임의의 값으로 선택하여, 그 값과 찾고자 하는 값의 크고 작음을 비교하는 방식을 채택하고 있다. 처음 선택한 중앙값이 만약 찾는 값보다 크면 그 값은 새로운 최댓값이 되며, 작으면 그 값은 새로운 최솟값이 된다. 검색 원리상 정렬된 리스트에만 사용할 수 있다는 단점이 있지만, 검색이 반복될 때마다 목표값을 찾을 확률은 두 배가 되므로 속도가 빠르다는 장점이 있다.
[python] check parenthesis matching
import queue
class PaMatch():
def __init__(self):
super(PaMatch, self).__init__()
self.lst = queue.LifoQueue()
self.check = 0
def push(self, a):
self.lst.put(a)
def pop(self):
return self.lst.get()
def checkMatch(self, string):
for i in range(len(string)):
if string[i] == "(":
self.push(i)
elif string[i] == ")":
if self.lst.qsize() >= 1:
# 첫번째 출력이 아닐 경우 "," 추
if self.check > 0:
print(",", end="")
print("({},{})".format(self.pop(),i), end="")
self.check += 1
# parenthsis가 맞지 않을 경우 남은 자리를 보여주고 종료
else:
print("\nNot matched : {}".format(i), end="")
# parenthsis가 맞지 않을 경우 남은 자리를 보여주고 종료
for i in range(self.lst.qsize()):
print("\nNot matched : {}".format(self.lst.get()), end="")
print("")
# Good Matching Case
string = "((((A+B)-C)*D)/S*A)"
A = PaMatch()
A.checkMatch(string)
# Not Good Matching Case 1
string2 = "(((((((A+B)-C)*D)/S*A"
B = PaMatch()
B.checkMatch(string2)
# Not Good Matching Case 2
string3 = "((((A+B)-C)*D)))/S*A))))"
C = PaMatch()
C.checkMatch(string3)
(3,7),(2,10),(1,13),(0,18) (6,10),(5,13),(4,16) Not matched : 3 Not matched : 2 Not matched : 1 Not matched : 0 (3,7),(2,10),(1,13),(0,14) Not matched : 15 Not matched : 20 Not matched : 21 Not matched : 22 Not matched : 23
2018/07/14
[python] 공공 Data를 이용한 동네 예보 처리
공공 Data 활용을 위한 service_key 신청은 Link를 참조.
# -*- coding: utf-8 -*-
import datetime as dt
import requests as req
from bs4 import BeautifulSoup
w_items = {"POP":["강수확률", "%"], "PTY":["강수형태", ""], "R06":["6시간 강수량", "mm"], "REH":["습도", "%"], "S06":["6시간 신적설", "cm"],
"SKY":["하늘상태", ""], "T3H":["3시간 기온", "°C"], "TMN":["아침 최저 기온", "°C"], "TMX":["낮 최고 기온", "°C"],
"UUU":["풍속(동서성분)","m/s"], "VVV":["풍속(남북성분)","m/s"], "WAV":["파고", "m"], "VEC":["풍향", ""], "WSD":["풍속", "m/s"]}
wind_dict = {0:"N",1:"NNE",2:"NE",3:"ENE",4:"E",5:"ESE",6:"SE",7:"SSE",8:"S",9:"SSW",10:"SW",11:"WSW",12:"W",13:"WNW",14:"NW",15:"NNW",16:"N"}
rain_dict = {0:"없음", 1:"비", 2:"진눈깨비", 3:"눈"}
# 가장 최근의 기상청 예보 시간(02:10 이후 3시간 단위) get
def get_rpt_time():
base_time = dt.datetime.now() - dt.timedelta(hours=2) - dt.timedelta(minutes=10)
hour = int(base_time.strftime("%H"))
rehour = str(hour//3*3 + 2).zfill(2)
return [base_time.strftime("%Y%m%d"), rehour + "00"]
# 풍향 계산용
def get_wind_type(i):
return wind_dict[(i + 22.5 * 0.5)//22.5]
def get_sky_status(i):
if i >= 0 and i <= 2: return "맑음"
elif i >= 3 and i <= 5: return "구름조금"
elif i >= 6 and i <= 8: return "구름많음"
elif i >= 9 and i <= 10: return "흐림"
def get_real_value(c, s):
if c.string == "VEC":
return get_wind_type(int(s.string))
elif c.string == "SKY":
return get_sky_status(int(s.string))
elif c.string == "PTY":
return rain_dict[int(s.string)]
return s.string
# have to change with your service_key
service_key = "MJqwsP2VlmHlaRh0BMwMAtDvhfFu6k59h%2B1Svp2A%......."
nx = 60 # 서울 기준
ny = 127 # 서울 기준
date = get_rpt_time()
base_url = "http://newsky2.kma.go.kr/service/SecndSrtpdFrcstInfoService2/ForecastSpaceData?ServiceKey={}&base_date={}&base_time={}&nx={}&ny={}"
url = base_url.format(service_key, date[0], date[1], nx, ny)
contents = req.get(url)
weather = BeautifulSoup(contents.content, 'lxml-xml')
print("\t **************************************")
print("\t Report Time :", date[0], date[1])
print("\t **************************************")
for item in weather.find_all("item"):
print("\t", w_items[item.category.string][0], " : ", get_real_value(item.category, item.fcstValue), end = "")
if w_items[item.category.string][1] != "":
print(w_items[item.category.string][1])
else:
print()
<결과>
**************************************
Report Time : 20180715 1100
**************************************
강수확률 : 10%
강수형태 : 없음
습도 : 50%
하늘상태 : 맑음
3시간 기온 : 31°C
낮 최고 기온 : 33.0°C
풍속(동서성분) : 3.1m/s
풍향 : WSW
풍속(남북성분) : 1.3m/s
풍속 : 3.4m/s
[python] get current datetime
from datetime import datetime
datetime.today() # get current date
datetime.today().year # get current year
datetime.today().month # get current month
datetime.today().day # get current day
datetime.today().hour # get current hour
datetime.today().strftime("%Y/%m/%d %H:%M:%S") # get current date with format yyyy/mm/dd hh24:mm:ss
[python] all markers in matplotlib.pypolot.scatter
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
markers = {'.': 'point', ',': 'pixel', 'o': 'circle', 'v': 'triangle_down', '^': 'triangle_up', '<': 'triangle_left', '>': 'triangle_right',
'1': 'tri_down', '2': 'tri_up', '3': 'tri_left', '4': 'tri_right', '8': 'octagon', 's': 'square', 'p': 'pentagon', '*': 'star',
'h': 'hexagon1', 'H': 'hexagon2', '+': 'plus', 'x': 'x', 'D': 'diamond', 'd': 'thin_diamond', '|': 'vline', '_': 'hline',
'P': 'plus_filled', 'X': 'x_filled', 0: 'tickleft', 1: 'tickright', 2: 'tickup', 3: 'tickdown', 4: 'caretleft', 5: 'caretright',
6: 'caretup', 7: 'caretdown', 8: 'caretleftbase', 9: 'caretrightbase', 10: 'caretupbase', 11: 'caretdownbase',
'None': 'nothing', None: 'nothing', ' ': 'nothing', '': 'nothing'}
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
area = (30 * np.random.rand(N))**2
for key, value in markers.items():
plt.scatter(x, y, s=area, c="g", alpha=0.5, marker=key, label=value)
plt.legend(loc=1)
plt.show()
피드 구독하기:
글 (Atom)




































