Q. 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

 

arr1 arr2 return
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]
[[1],[2]] [[3],[4]] [[4],[6]]

 

def sumMatrix(A,B):
    answer = []
    for i in range(len(A)):
        answer.append([])
        for j in range(len(A[0])):
            answer[i].append(A[i][j] + B[i][j])
    return answer

좋은 풀이는 위의 코드이다. 근데 이해가 안된다...

 

 

def solution(arr1, arr2):
    answer = []
    for i in range(len(arr1)):
        a = []
        for j in range(len(arr1[0])):
            a.append(arr1[i][j]+arr2[i][j])
            answer[i].append(a)
    return answer

이건 내 풀인데 왜 안되는거지...?

Q.

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

 

def solution(n):
    return int("".join(sorted(list(str(n)), reverse=True)));

이건 코드 자체를 공부해야한다.

지금 부족한 점은

1. 함수를 모름( sorted(reverse=True), join 이 뭔지 모름)

2. 간단명료하게 가로로 늘여 쓰는 것을 잘 못함

 

스터디 조원의 도움을 받아서 짜낸 코드가

def solution(n):
    m = list(str(n))
    m.sort(reverse=True)
    res = "".join(m)
    return int(res)

ㅋ....조인은 sql에서도 지랄이더니 여기서도ㅋ..

Q.

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

 

 

def solution(s):
    answer = True
    if len(s) == 4 or len(s)==6:
        for i in s:
            if i not in '0123456789':
                answer = False
    else:
        answer = False
        
    return answer

 

def alpha_string46(s):
    return s.isdigit() and len(s) in (4, 6)

isdigit() 숫자인지 확인하기

isalpha() 알파벳인지 확인하기 

Q. 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

 

def solution(n):
    m = list(str(n))
    num = list(map(int, m))
    l = len(m)
    a = [0]*l
    for i in range(0, l):
        for j in range(0, l):
            if i != j and i + j == (l-1):
                a[i]=num[j]
                a[j]=num[i]
            elif i == j and i + j == (l-1):
                a[i] = num[i]
    return a

 

Sol)

우선 자연수 n이 13569 라 가정한다.

우리는 [9,6,5,3,1]을 결과값으로 출력해야 한다. 

n을 각 자리 수마다 쪼개서 리스트에 담았다. 그리고 리스트를 다음과 같이 표현했다.

idx 0 1 2 3 4
1 3 5 6 9

결과값을 분석해보면

1과 9가 자리를 바꿨고, 3과 6이 자리를 바꿨다. 다시 말해

n[0]과 n[4]가 자리를 바꿨고, n[1]과 n[3]이 자리를 바꿔야한다.

자리를 바꿔야하는 인덱스들의 공통점은 합이 리스트 n의 길이 (또는 자연수 n이 자릿수) - 1과 같다. 

 

def solution(n):
    m = list(str(n))   #자연수 n을 각 자리수마다 쪼개서 list에 담기(문자열로만 담김)
    num = list(map(int, m))  #m에 담긴 값을 다시 int로 바꿔 num에 담기
    l = len(m)      #리스트 m의 길이
    a = [0]*l       #조건을 비교하여 집어넣을 빈 리스트 
    for i in range(0, l):
        for j in range(0, l):
            if i != j and i + j == (l-1):   # ex) l=5일 때, i=0, j=4이면
                a[i]=num[j]					# 자리가 바뀌게끔 a에 추가 
                a[j]=num[i]
            elif i == j and i + j == (l-1):  # ex) l=5일 때, i=2, j=2이면
                a[i] = num[i]				# 자리 바꿈없이 그냥 같은 인덱스에 추가
    return a

 

 

 

제한시간은 30분이지만 거진 1시간은 걸린 것 같다. 그래도 이렇게 코드를 전시하는 이유는 너어어어무 뿌듯하기 때문이다!! 물론 효율성은 떨어지는 코드다. reversed() 함수를 사용해도 됐지만 다른 로직으로 구현하고 싶은 욕심이 들어서 효율은 우선 재끼고 결국 만들어냈다!

알고리즘 공부를 제대로 시작한지는 이틀밖에 안됐는데 스스로가 만족스러운 성과를 냈다!! 야호!

 

 

 

Main
import AppWindow as a
import tkinter as tk

def main():
    win = tk.Tk()   #윈도우창
    app = a.AppWin(win, '300x300+100+100')
    win.mainloop()

main()

 

 

 

AppWindow
import tkinter as tk
import bus_info.service as binfo

class AppWin(tk.Frame):#AppWin은 Frame(위젯을 배치하는 판)
    def __init__(self, root=None, geo=None): #root:Tk()객체 geo=창크기위치
        #fr = tk.Frame(self.root)
        super().__init__(root)  # 부모 생성자에 기본 윈도우 전달
        self.root = root  # 기본 윈도우를 멤버변수로 저장
        self.root.geometry(geo)  # 윈도우의 크기 및 위치 설정
        self.root.resizable(True, True)  # 윈도우의 가로, 세로 크기 재조정 가능으로 설정
        self.pack()
        self.service = binfo.BusService()  #버스 앱 기능이 구현된 서비스 객체 생성
        self.create_widgets()

    def create_widgets(self):  # 원하는 구성요소 부착
        self.title = tk.Label(self, text='버스 정보 앱')
        self.title.pack()
        self.inputData = tk.Entry(self, width=20)
        self.inputData.pack()
        self.btn1 = tk.Button(self, text='노선ID로검색', command=self.handle1) #command:이벤트 핸들러 등록 속성
        self.btn1.pack()
        self.btn2 = tk.Button(self, text='노선ID로경로검색', command=self.handle2)  # command:이벤트 핸들러 등록 속성
        self.btn2.pack()
        self.btn3 = tk.Button(self, text='버스명검색', command=self.handle3)  # command:이벤트 핸들러 등록 속성
        self.btn3.pack()
        self.btn4 = tk.Button(self, text='노선ID로정거장검색', command=self.handle4)  # command:이벤트 핸들러 등록 속성
        self.btn4.pack()
        self.content = tk.Label(self, text='')
        self.content.pack()

    def handle1(self):
        busId = self.inputData.get()
        res = self.service.getRouteInfoItem(busId)
        self.content.config(text=res)
        self.inputData.delete(0, tk.END)

    def handle2(self):
        busId = self.inputData.get()
        res = ''
        res_list = self.service.getRoutePathList(busId)
        if str(type(res_list)) == "<class 'str'>":
            res = res_list
        else:
            for i in res_list:
                res += i.__str__()+'\n'  #no:1(x, y)
        self.content.config(text=res)
        self.inputData.delete(0, tk.END)

    def handle3(self):
        busName = self.inputData.get()
        res = ''
        res_list = self.service.getBusRouteList(busName)
        if str(type(res_list)) == "<class 'str'>":
            res = res_list
        else:
            for i in res_list:
                res += i.__str__() + '\n'  # no:1(x, y)
        self.content.config(text=res)
        self.inputData.delete(0, tk.END)

    def handle4(self):
        busId = self.inputData.get()
        res = ''
        res_list = self.service.getStaionsByRouteList(busId)
        if str(type(res_list)) == "<class 'str'>":
            res = res_list
        else:
            for i in res_list:
                res += i.__str__() + '\n'  # no:1(x, y)
        self.content.config(text=res)
        self.inputData.delete(0, tk.END)

 

 

 

 

 

 

Vo
#Value Object: 값을 담을 클래스

class BusVo:#버스 노선 정보 담을 클래스
    def __init__(self, busId=None,busNm=None,stStat=None,edStat=None,term=None,firstTm=None,lastTm=None,corpNm=None):
        self.busRouteId=busId
        self.busRouteNm=busNm
        self.stStationNm=stStat
        self.edStationNm=edStat
        self.term=term
        self.firstBusTm=firstTm
        self.lastBusTm=lastTm
        self.corpNm=corpNm

    def __str__(self):
        res = ''
        res += 'bus id: ' + self.busRouteId
        res += '\nbus name: ' + self.busRouteNm
        res += '\nstart station: ' + self.stStationNm
        res += '\nend station: ' + self.edStationNm
        res += '\nterm: ' + self.term
        res += '\nfirst bus time: ' + self.firstBusTm
        res += '\nlast bus time: ' + self.lastBusTm
        res += '\ncorp name: ' + self.corpNm
        return res

class PointVo:
    def __init__(self, no=None, gps_x=None, gps_y=None):
        self.no = no
        self.gps_x = gps_x
        self.gps_y = gps_y

    def __str__(self):
        return 'no: '+self.no+' ('+ self.gps_x + ' , '+ self.gps_y + ')'


class StationVo:
    def __init__(self, seq=None, stat=None, id=None):
        self.seq=seq
        self.stationNm=stat
        self.arsId=id

    def __str__(self):
        return 'seq: '+self.seq+' / station name: '+self.stationNm+ ' / ars id:'+self.arsId

 

 

 

 

SERVICE


getRouteInfoItem(노선ID): 리턴값은 BUS_VO 객체 한개 반환

  1) 노선기본정보항목조회(URL:getRouteInfoItem): 
=> 버스 노선ID를 입력받는다 
=> OPEN API에 URL(getRouteInfoItem)로 요청보냄 
=> 요청 응답(XML: 이 파일은 버스 정보가 담겨있음)을 받으면 파싱을 해서 BUS_VO에 저장할 값들만 추출 
=> 추출한 정보를 BUS_VO에 담는다
=> BUS_VO 리턴


getRoutePathList(노선ID): 경로 묶음. POINT_VO객체들을 리스트에 담아서 반환

   2) 노선경로목록조회(URL:getRoutePathList)
=> 버스 노선ID를 입력받는다 
=> OPEN API에 URL(getRoutePathList)로 요청보냄
=> 요청 응답(XML: 경유하는 정류소의 좌표정보가 담겨있음)을 받으면 파싱을 해서 POINT_VO에 저장할 값들만 추출
=> 추출한 정보를 POINT_VO에 담아서 리스트에 담는다(정류소 좌표가 여러개)
=>리스트 반환


getBusRouteList(버스명): 찾아진 버스정보를 BUS_VO 객체로 만들어서 리스트에 담아서 반환

 3) 노선번호목록조회(URL: getBusRouteList)
=> 버스명 입력받는다(100번 입력하면 이름에 100이 들어간 모든 버스 검색. 여러개 검색됨)
=> OPEN API에 URL(getBusRouteList)로 요청보냄
=> 요청 응답(XML: 이 파일은 버스 정보가 담겨있음)을 받으면 파싱을 해서 BUS_VO에 저장할 값들만 추출 
=> 추출한 정보를 BUS_VO에 담고 이를 리스트에 담는다(버스 여러개 검색됨)
=>리스트 반환


getStaionsByRouteList(노선ID): 찾아진 이 노선의 정거역을 STATION_VO 객체로 만들어 리스트에 담아서 반환

   4) 노선별경유정류소목록조회(URL: getStaionsByRouteList)
=> 버스 노선ID를 입력받는다 
=> OPEN API에 URL(getStaionsByRouteList)로 요청보냄
=> 요청 응답(XML: 경유하는 정류소의 다양한 정보가 담겨있음)을 받으면 파싱을 해서 STATION_VO에 저장할 값들만 추출
=> 추출한 정보를 STATION_VO에 담아서 리스트에 담는다(정류소 여러개가 검색됨)
=>리스트 반환

 

import requests
from bs4 import BeautifulSoup
import bus_info.vo as vo

class BusService:
    def __init__(self):
        self.url = 'http://ws.bus.go.kr/api/rest/busRouteInfo/%s?ServiceKey=%s&%s=%s'
        self.apiKey = 'BYgs6%2FjSL0du1z8yK4GxYdW1SepukkJ0gXtUP3tGUQpjThEU4JeQKRlspdSnxTWcjia6U6r5oPxW%2F7tK7HZ2sg%3D%3D'

    def getRouteInfoItem(self, busId):
        url = self.url%('getRouteInfo', self.apiKey, 'busRouteId', busId)
        print(url)
        html = requests.get(url).text #url 에 웹 요청
        root = BeautifulSoup(html, 'lxml-xml')  # 파서의 종류를 xml로 지정
        code = root.find('headerCd').get_text()
        msg = root.find('headerMsg').get_text()
        print('처리결과:', msg)
        if code == '0':
            busRouteId = root.find('busRouteId').get_text()
            busRouteNm = root.find('busRouteNm').get_text()
            stStationNm = root.find('stStationNm').get_text()
            edStationNm = root.find('edStationNm').get_text()
            term = root.find('term').get_text()
            firstBusTm = root.find('firstBusTm').get_text()
            lastBusTm = root.find('lastBusTm').get_text()
            corpNm = root.find('corpNm').get_text()

            return vo.BusVo(busRouteId, busRouteNm, stStationNm, edStationNm, term, firstBusTm, lastBusTm, corpNm)

    #노선id를 전달하면 노선의 경로를 (x,y)
    def getRoutePathList(self, busId):
        url = self.url % ('getRoutePath', self.apiKey, 'busRouteId', busId)
        print(url)
        html = requests.get(url).text  # url 에 웹 요청
        root = BeautifulSoup(html, 'lxml-xml')  # 파서의 종류를 xml로 지정
        code = root.find('headerCd').get_text()
        msg = root.find('headerMsg').get_text()
        print('처리결과:', msg)
        paths=[]
        if code == '0':
            itemList = root.select('itemList')
            for item in itemList:
                no = item.find('no').get_text()
                x = item.find('gpsX').get_text()
                y = item.find('gpsY').get_text()
                paths.append(vo.PointVo(no, x, y))

            return paths

    def getBusRouteList(self, busName):
        url = self.url % ('getBusRouteList', self.apiKey, 'strSrch', busName)
        print(url)
        html = requests.get(url).text  # url 에 웹 요청
        root = BeautifulSoup(html, 'lxml-xml')  # 파서의 종류를 xml로 지정
        code = root.find('headerCd').get_text()
        msg = root.find('headerMsg').get_text()
        print('처리결과:', msg)
        bus = []
        if code == '0':
            itemList = root.select('itemList')
            for item in itemList:
                busRouteId = item.find('busRouteId').get_text()
                busRouteNm = item.find('busRouteNm').get_text()
                stStationNm = item.find('stStationNm').get_text()
                edStationNm = item.find('edStationNm').get_text()
                term = item.find('term').get_text()
                firstBusTm = item.find('firstBusTm').get_text()
                lastBusTm = item.find('lastBusTm').get_text()
                corpNm = item.find('corpNm').get_text()

                bus.append(vo.BusVo(busRouteId, busRouteNm, stStationNm, edStationNm, term, firstBusTm, lastBusTm, corpNm))
            return bus

    def getStaionsByRouteList(self, busId):
        url = self.url % ('getStaionByRoute', self.apiKey, 'busRouteId', busId)
        print(url)
        html = requests.get(url).text  # url 에 웹 요청
        root = BeautifulSoup(html, 'lxml-xml')  # 파서의 종류를 xml로 지정
        code = root.find('headerCd').get_text()
        msg = root.find('headerMsg').get_text()
        print('처리결과:', msg)
        stations = []
        if code == '0':
            itemList = root.select('itemList')
            for item in itemList:
                seq = item.find('seq').get_text()
                stationNm = item.find('stationNm').get_text()
                arsId = item.find('arsId').get_text()
                stations.append(vo.StationVo(seq, stationNm, arsId))
            return stations

 

 

 

 

import bus_info.service as binfo

def main():
    bservice = binfo.BusService()#busservice 객체 생성

    vo = bservice.getRouteInfoItem('100100124')
    if vo == None:
        print('검색안됨')
    else:
        print(vo)


    '''
    bus = bservice.getBusRouteList('0017')
    if bus == None:
        print('없는 버스 이름')
    else:
        for b in bus:
            print(b)

    paths = bservice.getRoutePathList('100100124')
    if paths == None:
        print('없는 노선')
    else:
        for p in paths:
            print(p)
            
        stations = bservice.getStaionsByRouteList('100100124')
    if stations == None:
        print('없는 버스 이름')
    else:
        for s in stations:
            print(s)
    '''
main()

 

 

계산기 만들기

 

 

import tkinter as tk

operation = ''   #연산자 저장 변수
temp_number = 0   #이전값 저장 변수

def button(val):
    if val == 'C':
        number.delete(0, 'end')
    else:
        number.insert('end', val)
        print(val)
    

def cal(val):
    global operation
    global temp_number
    if number.get() != '':
        operation = val
        temp_number = int(number.get())
        number.delete(0, 'end')
        print(temp_number, operation) 
    
def equl():
    global operation
    global temp_number
    if operation != '' and number.get() !='':
        num = int(number.get())
        if operation == '+':
            solution = temp_number+num
        elif operation == '-':
            solution = temp_number - num
        elif operation == '*':
            solution = temp_number * num
        else:
            solution = temp_number/num
            
        number.delete(0,'end')
        number.insert(0,solution)            
        print(temp_number,operation,num,'=',solution) 
        operation =''
        temp_number = 0
    
    
win = tk.Tk()
win.title('Calculator')
win.geometry('300x400+100+100')
win.resizable(False, False)

label = tk.Label(win, height=4)
label.grid(row=0, column=0)

entry_value = StringVar(win, value='')

number = ttk.Entry(win, textvariable = entry_value, width=20)  #숫자 및 결과 표시창
number.grid(row=0, columnspan=3)

b1 = tk.Button(text='1', width=7, height=4, command=lambda:button('1'))
b1.grid(row=1, column=0)
b2 = tk.Button(text='2', width=7, height=4, command=lambda:button('2'))
b2.grid(row=1, column=1)
b3 = tk.Button(text='3', width=7, height=4, command=lambda:button('3'))
b3.grid(row=1, column=2)
b4 = tk.Button(text='+', width=7, height=4, command=lambda:cal('+'))
b4.grid(row=1, column=3)

b5 = tk.Button(text='4', width=7, height=4, command=lambda:button('4'))
b5.grid(row=2, column=0)
b6 = tk.Button(text='5', width=7, height=4, command=lambda:button('5'))
b6.grid(row=2, column=1)
b7 = tk.Button(text='6', width=7, height=4, command=lambda:button('6'))
b7.grid(row=2, column=2)
b8 = tk.Button(text='-', width=7, height=4, command=lambda:cal('-'))
b8.grid(row=2, column=3)

b9 = tk.Button(text='7', width=7, height=4, command=lambda:button('7'))
b9.grid(row=3, column=0)
b10 = tk.Button(text='8', width=7, height=4, command=lambda:button('8'))
b10.grid(row=3, column=1)
b11 = tk.Button(text='9', width=7, height=4, command=lambda:button('9'))
b11.grid(row=3, column=2)
b12 = tk.Button(text='*', width=7, height=4, command=lambda:cal('*'))
b12.grid(row=3, column=3)

b13 = tk.Button(text='0', width=7, height=4, command=lambda:button('0'))
b13.grid(row=4, column=0)
b14 = tk.Button(text='C', width=7, height=4, command=lambda:f1('C'))
b14.grid(row=4, column=1)
b15 = tk.Button(text='=', width=7, height=4, command=lambda:equl())
b15.grid(row=4, column=2)
b16 = tk.Button(text='/', width=7, height=4, command=lambda:cal('/'))
b16.grid(row=4, column=3)
    
win.mainloop()

아직 계산 오류(소숫점 등)를 고려하지 않은 상태이다.

 

앗, eval 함수를 쓰면 cal, equl 함수 없이도 되는구나..

def f1(val):
    s = label.cget('text')
    s += val #s:12
    label.config(text=s)#config():위젯 속성의 값을 읽거나 설정
    
def calc():
    s = label.cget('text') #s:'5-1+6*2'
    print(s)
    res = eval(s)
    label.config(text=str(res))
    
def clear():
    label.config(text='')
    
win = tk.Tk()#Tk객체 생성=>기본 윈도우와 ui api를 제공하는 객체
win.title('window title')
win.geometry('300x400+100+100')
win.resizable(False, False)

#위젯 생성 및 배치
label = tk.Label(win, height=4)
label.grid(row=0, column=0)

b1 = tk.Button(text='1', width=7, height=4, command=lambda:f1('1'))
b1.grid(row=1, column=0)
b2 = tk.Button(text='2', width=7, height=4, command=lambda:f1('2'))
b2.grid(row=1, column=1)
b3 = tk.Button(text='3', width=7, height=4, command=lambda:f1('3'))
b3.grid(row=1, column=2)
b4 = tk.Button(text='+', width=7, height=4, command=lambda:f1('+'))
b4.grid(row=1, column=3)
b5 = tk.Button(text='4', width=7, height=4, command=lambda:f1('4'))
b5.grid(row=2, column=0)
b6 = tk.Button(text='5', width=7, height=4, command=lambda:f1('5'))
b6.grid(row=2, column=1)
b7 = tk.Button(text='6', width=7, height=4, command=lambda:f1('6'))
b7.grid(row=2, column=2)
b8 = tk.Button(text='-', width=7, height=4, command=lambda:f1('-'))
b8.grid(row=2, column=3)
b9 = tk.Button(text='7', width=7, height=4, command=lambda:f1('7'))
b9.grid(row=3, column=0)
b10 = tk.Button(text='8', width=7, height=4, command=lambda:f1('8'))
b10.grid(row=3, column=1)
b11 = tk.Button(text='9', width=7, height=4, command=lambda:f1('9'))
b11.grid(row=3, column=2)
b12 = tk.Button(text='*', width=7, height=4, command=lambda:f1('*'))
b12.grid(row=3, column=3)
b13 = tk.Button(text='0', width=7, height=4, command=lambda:f1('0'))
b13.grid(row=4, column=0)
b14 = tk.Button(text='C', width=7, height=4, command=clear)
b14.grid(row=4, column=1)
b15 = tk.Button(text='=', width=7, height=4, command=calc)
b15.grid(row=4, column=2)
b16 = tk.Button(text='/', width=7, height=4, command=lambda:f1('/'))
b16.grid(row=4, column=3)
    
win.mainloop()

 

 

심지어 버튼 구현 노가다 없이 for문으로도 가넝...

 

def f1(val):
    s = label.cget('text')
    s += val
    label.config(text=s)   #config():위젯 속성의 값을 읽거나 설정

def calc():
    s = label.cget('text')
    print(s)
    res = eval(s)    #eval 함수: 자동으로 계산해주는 함수
    label.config(text=str(res))
    
def clear():
    label.config(text='')
    
win = tk.Tk()
win.title('window title')
win.geometry('300x400+100+100')
win.resizable(False, False)
   
label = tk.Label(win, height=4)
label.grid(row=0, column=0)

nums = [['1','2','3','+'],['4','5','6','-'],['7','8','9','*'],['0','C','=','/']]

    
for i in range(0, 4):
    for j in range(0, 4):
        num = nums[i][j]
        if num =='C':
            b = tk.Button(text=num, width=7, height=4, command=clear)
        elif num == '=':
            b = tk.Button(text=num, width=7, height=4, command=calc)
        else:
            b = tk.Button(text=num, width=7, height=4, command=lambda val=num :f1(val))
        b.grid(row=(i+1), column=j)
        
        
win.mainloop()

 

'파이썬II' 카테고리의 다른 글

파이썬II #Web Data Read  (0) 2021.07.02
파이썬II # 공공데이터 분석(1)  (0) 2021.07.01
파이썬II #파일 open 후 데이터 추출하기  (0) 2021.06.30

 

스택(Stack : 쌓다)이란?

프로그래밍에서 목록 혹은 리스트에서 접근이 한 쪽에서만 가능한 구조

LILO(Last-In, Last-Out)

 

push, peek, pop 세 개의 함수 사용

 

Book1, 2, 3 을 차례대로 스택에 넣으면 

BOOK3
BOOK2
BOOk1

이렇게 쌓여진다. 만약 이 스택에 BOOK4를 추가하면

BOOk4
BOOk3
BOOk2
BOOk1

book3 위로 올라간다.

 

위에서 내려다보면 가장 맨 위에 있는 책(가장 위에있는 데이터) 만 보인다. 

가장 위에 있는(가장 마지막에 들어가있는)게 무엇인지 확인하는 함수가 peek

 

pop은 제일 마지막에 들어간 데이터를 꺼내는 것, 가장 맨 위의 것을 가져가는 것이다.

 

BOOKS = [BOOK1, BOOK2, BOOK3, BOOK4]

였다가 pop을 하면 [BOOK1, BOOK2, BOOK3] 가 된다.

 

 

phthon 스택의 구현방법

1. 직접구현

2. 이미 구현된 클래스 import

3. list를 스택으로 구현

(2,3은 이미 내장되어있는 함수라서 따로 class 구현할 필요가 없다)

 

 

 

1. 직접구현

class Stack(list):
    push = list.append

    def peek(self):
        return self[-1]  # 가장 마지막에 있는 데이터. self.[len(self)-1] 사용도 ㄱㅊ

s = Stack()
s.push(1)
s.push(5)
s.push(10)


print("my stack is:", s)  # 스택에 1, 5, 10이 순서대로 쌓임
print("popped value is:", s.pop())  # 맨 위 데이터인 10이 뽑힘
print("my stack is:", s)  # [1, 5] 만 남음
print("peeked value is:", s.peek())  # 맨 위의 데이터만 보임
print("my stack is:", s)  # pop한건 아니기 때문에 데이터는 그대로

 

 

3. python list를 스택으로 활용

s =[]
s.append(1)
s.append(5)
s.append(10)
print("my stack is:", s)
print("popped value is:", s.pop())
print("my stack is:", s)
print("peeked value is:", s[-1])    #인덱스로 픽
print("my stack is:", s)

 

 

 

 

큐(Queue: 일이 처리되기를 기다리는 리스트) 

 

프로그래밍에서 목록 혹은 리스트에서 접근이 양쪽에서 가능한 구조

FIFO(First-In, First-Out)

 

put / peek / get 함수가 존재

 

 

컨베이어 벨트가 있다. 이 벨트 위에 Box1,  Box2,  Box3을 순서대로 올리면

                          Box 3    Box2    Box1 

이렇게 되어있을 것이다.

 

여기에 box4를 넣으면 put

box의 리스트가 [box1, box2, box3, box4] 가 된다. 

 

peek으로 가장 먼저 들어간 box1 확인

get으로 가장 먼저 들아간 box1을 트럭에 실어!

 

 

python 큐 구현

 

1,2,3 구현 모두 같은 output을 보인다.

 

 

1. 직접구현

class Queue(list):
    put = list.append

    def peek(self):
        return self[0]  # 가장 앞에 있는 데이터 확인

    def get(self):
        return self.pop(0)  # 인덱스가 0인 데이터 pop

q = Queue()
q.put(1)
q.put(5)
q.put(10)

print("my queue is:", q)  # [1, 5, 10]
print("removed value is:", q.get())  # 가장 먼저 들어간 애를 get!
print("my queue is:", q)  # [5, 10]
print("peeked value is:", q.peek())  # 가장 나중에 들어간 애 확인만
print("my queue is:", q)  # [5, 10]

 

 

 

2. 이미 구현된 클래스 import

from queue import Queue

q = Queue()
q.put(1)
q.put(5)
q.put(10)
print("my queue is:", q)    # [1,5,10]
print("removed value is:", q.get())    #get 정의 하지 않아도 내장되어있어서 사용가능
print("my queue is:", q)
print("peeked value is:", q.peek())    #peek도 자동 내장

 3. list를 큐로 구현

 

q = []

q.append(1)
q.append(5)
q.append(10)

print("my queue is:", q)
print("removed value is:", q.pop(0))   #get쓰면 안되나?
print("my queue is:", q)
print("peeked value is:", q[0])
print("my queue is:", q)

 

 

<!doctype himl> -- 문서종류 지정:html
<html>
  <head>
    <title> asdf </title>
  </head>
  <body>
    <div id='d1' class='c1'> 웹페이지에 들어갈 내용 </div>
    <div id='d2' class='c1'> 웹페이지에 들어갈 내용 </div>
    <div id='d3' class='c2'> 웹페이지에 들어갈 내용 </div>
    <a href=">adsf</a>
    <h1>adf</h1>
  </body?
</html>

 

DOM(Document Object Model)

         root --- 문서

               ㅣ

             html

                l

     head --------body

       l--------------l

     title            div-----p

 

 

 

ajax(비동기 javascript and xml)

 

html 페이지

공공데이터 표현 방법

json(javascript object notation)

  (오늘의 날씨 같은 거, 실시간으로 바뀌는 정보들)

  객체는 {}

  배열 []

xml (요즘엔 사용 잘 안해)

  디스크립터 : 시스템(컨테이너)에 설명하는 파일, xml로 표현

  공공데이터표현

 

{'name':'aaa', 'tet':'1111', 'addr':'대한민국'}

[{'name':'aaa', 'tet':'1111', 'addr':'대한민국'},

{'name':'aaa', 'tet':'1111', 'addr':'대한민국'),

{'name':'aaa', 'tet':'1111', 'addr':'대한민국')]

 

<persons>
  <person>
     <name>aaa</name>
     <tet>111</tel>
     <addr>qwerqw</addr>
  </person>
  
  <person>
     <name>bbb</name>
     <tet>222</tel>
     <addr>asdfsdf</addr>
  </person>
</persons>

 

'파이썬II' 카테고리의 다른 글

tkinter #계산기 만들기  (0) 2021.07.08
파이썬II # 공공데이터 분석(1)  (0) 2021.07.01
파이썬II #파일 open 후 데이터 추출하기  (0) 2021.06.30
import numpy as np
import pandas as pd

data=pd.read_csv('d.csv', encoding='euc-kr')
data

 

 

a=data[data.columns].loc[:11]
a

 

a = data[['월','사고건수','사망자수','중상자수','경상자수','부상신고자수']].loc[:11]
a

 

 

val = a.values
title = data['가해자연령층'][0]
cols = [[title,title,title,title,title,title],data.columns[1:]]
x = pd.DataFrame(val, columns=cols)
x

 

 

#배열명[컬럼명]
#배열명.loc[인덱스명]
#a.data[data.cols = [data.columns[1:]].loc[:11]  #원하는 요소만 추출

tabs = []
idx = ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월']
cnt = len(data)//12     # / 1개면  실수로 계산, // 2개면 정수로 계산
for i in range(0, cnt):
    y= i*12
    title = data['가해자연령층'][y]
    vals = data[data.columns[2:]].loc[y:y+11]
    cols = [[title,title,title,title,title],data.columns[2:]]
    x = pd.DataFrame(vals.values, columns = cols, index=idx)
    tabs.append(x)
    
tabs

 

 

 

 

res = tabs[0]
res=tabs[0]
for i in range(1, len(tabs)):
    res = res.join(tabs[i])
    
res

 

#연령별 최대 사고 발생월과 사고수

for i in tabs:
    #m = i['20세이하',사고건수'].max()   #하드코드 불가능
    #x = i['20세이하','사고건수'].argmax()
    m = i[i.columns[0]].max()
    x = i[i.columns[0]].argmax()
    print(i.columns[0][0],'의 최대 사고건수:',m, ' / 발생 월:',idx[x] )

 

 

#연령별 12개월의 사고발생 총건, 총 사망자수

for i in tabs:
    s = i[i.columns[0]].sum()
    d = i[i.columns[1]].sum()
    print(i.columns[0][0],'의 사고발생 총 건:',s, ' / 총 사망자수:',d) 

 

#연령별 12개월 사고 발생 평균 값

for i in tabs:
    m = i[i.columns[0]].mean()
    print(i.columns[0][0],'의 사고 발생 평균:',m) 

'파이썬II' 카테고리의 다른 글

tkinter #계산기 만들기  (0) 2021.07.08
파이썬II #Web Data Read  (0) 2021.07.02
파이썬II #파일 open 후 데이터 추출하기  (0) 2021.06.30

+ Recent posts