■ 19. 대입 연산자 이해하기(=)
a=1
왼쪽의 변수에 오른쪽의 값을 대입해라
->대입 연산자와 일반 연산자를 비교
1. = : 대입 연산자
2. == : 같다
3. in : 여러개의 값 비교
문제47. 아래의 리스트 변수에서 positive 라는 단어는
몇 개 나오는가?
word=['winter' ,'cold', 'positive', 'negative']
답:
word=['winter' ,'cold', 'positive', 'negative']
sum=0
for i in word
if i =='positive':
sum=sum+1
print(sum)
->postive 일 때만 sum을 하라는 명령.
또는
word=['winter' ,'cold', 'positive', 'negative']
word.count('positive')
word.count('positive')
↓ ↓
객체 함수
문제48. word 리스트에서는 positive 와 negative 단어가
몇 개가 들어있는가?
word=['winter' ,'cold', 'positive', 'negative']
sum=0
for i in word:
if i in ['positive', 'negative']:
sum=sum+1
print(sum)
문제49. 겨울왕국 대본에는 긍정적인 단어가 몇 개가 들어있는가?
*알고리즘 활용 예
라이나 생명 데이터 분석 프로젝트
보험 상담원이 상담사가 규칙에 맞는 단어를 사용해서
상담을 했는지 판독하는 프로젝트
상담원의 상담 내용 녹음(음성)---->텍스트로 변환
예: 90일 이라고 얘기해야하는데, 3달이라고 얘기하는,
규칙에 맞지 않는 단어를 사용한 상담사를 찾는데
사용하는 코드
winter=open('d:\\winter.txt','r')
winter=winter.read().split(' ') #공백으로 구분
positive=open('d:\\positive-words.txt','r')
positive_line=positive.read().split('\n') #엔터로 구분
"""for i in positive_line:
print(i)"""
sum=0
for w in winter:
if w.lower() in positive_line:
sum=sum+1
print(sum)
문제42.(미리 내주신 점심시간 문제)
팩토리얼을 while loop 문으로 구현하시오!
5! = 5 x 4 x 3 x 2 x 1 = 120
팩토리얼 숫자를 입력하세요~ 5
120 입니다.
while문
a=int(input("팩토리얼 숫자를 입력"))
factorial=1
x=0
while a > x:
x= 1+x
factorial=factorial*x
print(factorial,"입니다")
for문
a=int(input("팩토리얼 숫자를 입력"))
factorial=1
for i in range(1, a+1):
factorial=factorial*i
print(factorial,'입니다')
■ 20. 사칙 연산자 이해하기(+, - , *, /, ** )
*오라클의 기타 비교 연산자와 파이썬 연산자 비교
오라클 vs 파이썬
1. between..and >= & <=
2. in in
3. is null ==''
4. like ^, %, 정규식 함수
문제51. 월급이 1000 에서 3000 사이인 사원들의
이름, 월급을 출력하시오.
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if int(emp2_list[5]) >= 1000 and int(emp2_list[5]) <= 3000:
print(emp2_list[1], emp2_list[5])
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if int(emp2_list[5]) >= 1000 and int(emp2_list[5]) <= 3000:
print(emp2_list[1],emp2_list[5])
문제52. 부서번호가 10, 20번이 아닌 사원들의
이름, 부서번호를 출력하시오
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if int(emp2_list[7]) not in (10, 20):
print(emp2_list[1],emp2_list[7])
문제53.
아래의 sql을 파이썬으로 구현하시오
select ename, substr(ename, 1,1)
from emp;
↓
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
print(emp2_list[1] , emp2_list[1][0])
↑ ↑
list의 1번째, 해당 list의 첫번째 철자(또는 숫자)
문제54. 아래의 sql을 파이썬으로 구현하시오
SQL> select ename
from emp
where ename like 'S%';
↓
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if emp2_list[1][0] == 'S':
print(emp2_list[1])
**이름에 'S' 가 들어가는 사원을 뽑으시오
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if 'S' in emp2_list[1]:
print(emp2_list[1])
문제55. 아래의 sql 을 파이썬으로 구현하시오
SQL> select ename
from emp
where ename like '_M%';
↓
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if emp2_list[1][1] == 'M':
print(emp2_list[1])
문제56. 오라클이 rdbms 를 만들어서 크게 성공을 했는데
rdbms 의 꽃이 바로 join(조인) 이다.
*조인의 방법 3가지
1. nested loop join
2. hash join
3. sort merge join
일단 dept.csv 를 불러오시오.
import csv
file=open("d:\\csv\\dept2.csv", 'r')
dept_csv=csv.reader(file)
for dept_list in dept_csv:
print(dept_list)
문제57. 아래의 sql을 파이썬으로 구현하시오
"nested loop 조인"
SQL> select e.ename, d.loc
from emp e, dept d
where e.deptno = d.deptno;
오답:
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
file=open("d:\\csv\\dept2.csv", 'r')
dept_csv=csv.reader(file)
for emp2_list in emp2_csv:
for dept_list in dept_csv:
if int(emp2_list[7])==int(dept_list[0]):
print(emp2_list[1], dept_list[2])
******
range 넣었을 때 처럼 이중루프가 돌아야 하는게 맞는데,
csv 파일은 그러질 못한다.
emp2_list 의 KING을 가지고 dept 4rows 돌고
emp2_list 의 BLAKE를 가지고dept 4rows 돌아야 한다.
근데 여기서는
KING 까지 돌고 멈추기 때문에
KING NEW YORK 만 나온다.
******
----------------------
이수답:
import csv
file = open("d:\\csv\\emp2.csv", 'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
file = open("d:\\csv\\dept2.csv", 'r')
dept_csv = csv.reader(file)
for dept_list in dept_csv:
if emp_list[7] == dept_list[0]:
print(emp_list[1], dept_list[2])
※ 파일 오픈해서 가지고 오는 타입은
중첩 for문 시, 한번 돌면, 데이터가 소진된다.(이유모름)
그래서 메인 for 문 안에다가 file=open 을 시켜줘서 돌려야 한다.
■ 21. 연산자 축약 이해하기( +=, -=, *=, /= )
예제:
a=0
a += 1 #a의 값은? a = a+1, a= 1
a -= 5 #a의 값은? a = a -5 a= -4
a *= 2 #a의 값은? a = a*2 a= -8
a /= 4 #a의 값은? a = a/4 a= -2
문제58. 위의 코드를 이용해서 아래와 같이 a값에 들어갈
숫자를 물어보게 하고
결과를 출력되게 하시오
a=int(input("a값에 들어갈 숫자를 입력하세요"))
#10 입력
a = a+1
a = a-5
a = a*2
a = a/4
print(a)
답: 3.0
■ 22. True와 False 이해하기
예제:
a=True
b=False
print(a==1) #True가 출력됨
print(b!=0) #False가 출력됨
문제59. True를 사용해서 while loop문의 무한 루프문을
구현해서 숫자 7이 반복해서 출력되게 하시오
while True:
print(7)
->pandas 모듈 설치
import pandas as pd
emp = pd.read_csv("d:\\csv\\emp.csv")
print(emp)
■ 23. 관계연산자 이해하기 (==, !=, <, <=, > , >= )
문제61. 직업이 SALESMAN 이 아닌 사원들의 이름,직업을
출력하시오.
(import 방법으로)
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if str(emp2_list[2]) not in 'SALESMAN':
print(emp2_list[1], emp2_list[2])
-----------------------------
문제62. pandas 모듈을 이용해서 위의 결과를 출력하시오
import pandas as pd
emp = pd.read_csv("d:\\csv\\emp.csv")
result = emp[ ['ename','job'] ] [emp['job'] != 'SALESMAN']
print(result)
※판다스 기본 문법
emp [열 선택] [행 선택]
※ 설명
import pandas as pd
emp = pd.read_csv("d:\\csv\\emp.csv")
↑
pandas의 별칭
-> pandas를 읽어서 emp 라는 프레임에 넣어라.
병렬처리라서 속도가 빠르다.
문제63. 판다스를 이용해서 emp.csv 에서
월급이 3000 이상인 사원들의 이름, 월급을 출력하시오
import pandas as pd
emp=pd.read_csv("d:\\csv\\emp.csv")
result=emp[['ename','job']] [emp['sal']>= 3000]
print(result)
**result=''는 while, for 같은 경우에!
■ 24. 논리 연산자 이해하기(and, or, not)
문제64. 직업이 SALESMAN 이고
월급이 1200 이상인 사원들의 이름,월급,직업을 출력하시오
(판다스/파이썬 )
판다스
import pandas as pd
emp=pd.read_csv("d:\\csv\\emp.csv")
result = emp[['ename','sal','job']] [emp['job'] == 'SALESMAN'] [emp['sal']>=1200]
print(result)
파이썬
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if str(emp2_list[2]) in 'SALESMAN':
if int(emp2_list[5]) >= 1200:
print(emp2_list[1], emp2_list[5], emp2_list[2])
import pandas as pd
emp=pd.read_csv("d:\\csv\\emp.csv")
result = emp[['ename','sal','job']]
[(emp['job'] == 'SALESMAN')&(emp['sal']>=1200)]
print(result)
■ 기타 비교 연산자를 오라클과 파이썬 그리고 판다스와 비교
오라클 vs 파이썬 vs 판다스
1. between..and <= and >= <= & >=
2. in in isin
3. like emp_list[1][0] apply 함수
4. is null =='' isnull()
문제65. 직업이 SALESMAN, ANALYST 인 사원들의 이름,직업을
출력하시오
(판다스, 파이썬)
판다스
import pandas as pd
emp=pd.read_csv("d:\\csv\\emp.csv")
result = emp[['ename','sal','job']] [emp['job'].isin(['SALESMAN','ANALYST'])]
print(result)
파이썬
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if str(emp2_list[2]) in ('SALESMAN','ANALYST'):
print(emp2_list[1], emp2_list[5], emp2_list[2])
문제50. (미리 내주신 오늘의 마지막 문제)
while loop 문을 이용해서 최대공약수를 출력하시오
(for loop 문도 ㅇㅋ)
(break 의 필요성을 파악하기 좋은 문제)
첫번째 수를 입력하세요. 24
두번째 수를 입력하세요. 18
결과: 최대 공약수는 6 입니다.
**거꾸로 숫자 넣어도 답이 나와야 함***
첫번째 수를 입력하세요. 18
두번째 수를 입력하세요. 24
결과:최대 공약수는 6 입니다.
최대공약수가 해당 n개 숫자를 나눴을 때
나머지=0인 수를 말한다.
최대공약수 = x
a%x ==0 and b%x ==0
print( x,'는 최대 공약수 입니다')
================================
나중에 다시 푼거:
a=int(input('첫번째 숫자 입력'))
b=int(input('두번째 숫자 입력'))
x=min(a,b)
while x>=1: #
if a%x==0 and b%x==0:
result=x
break #while 문은 0<x<10 이렇게 범위 지정 아닌경우는
# 꼭 break 있어야 한다.
else:
x-=1
print(result)
***def로 바꿔서 써도 괜찮다.
while문
a=int(input('첫번째 숫자를 입력하시오'))
b=int(input('두번째 숫자를 입력하시오'))
x=min(a,b)
while x>=1:
if a%x==0 and b%x==0:
print('최대 공약수는', x,'입니다.')
break
else:
x = x- 1
----------------------------------
num1 = int( input('첫번째 수를 입력하시오 !'))
num2 = int( input('두번째 수를 입력하시오 !'))
result1='' #big
result2='' #small
result3=''
x=0
if num1>num2:
result1=num1
result2=num2
else:
result1=num2
result2=num1
while x<=result2:
x=x+1
if result1%x==0 and result2%x==0:
y=x
print(y)
**답은 0으로 나눠떨어진 모든 수가 나온다.
최대값만 출력하라는 함수를 알면 해결될 일이다.
이론을 이해하기엔 이게 제일 좋다고 생각한다.
for loop문
a=int(input("첫번째 숫자 입력"))
b=int(input("두번째 숫자 입력"))
x=max(a,b)
for i in range(x, 0, -1):
if a%i==0 and b%i==0:
print(i)
break #꼭 break 넣어야 한다. 안그러면 6이하 2값도 출력됨.
유클리드 호제법이란?
개념
유클리드 호제법은 2개의 자연수 또는 정식의 최대공약수를 구하는 알고리즘의 하나이다.
호제법이란 말은 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 나타낸다.
2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r’를 구하고, 다시 r을 r’로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0 이 되었을 때 나누는 수가 a와 b의 최대공약수이다.
예시:
1071 과 1029의 최대공약수를 구하면,
- 1071은 1029로 나누어 떨어지지 않기 때문에, 1071을 1029로 나눈 나머지를 구한다. => 42
- 1029는 42로 나누어떨어지지 않기 때문에, 1029를 42로 나눈 나머지를 구한다. => 21
- 42는 21로 나누어떨어진다.
따라서, 최대공약수는 21이다.
문제66. 이름의 첫번째 철자가 S로 시작하는 사원들의
이름을 출력하시오.
SQL> select ename,
from emp
where ename like 'S%';
↓
순수 파이썬(문제54번 이였음)
import csv
file=open("d:\\csv\\emp2.csv", 'r')
emp2_csv=csv.reader(file)
for emp2_list in emp2_csv:
if emp2_list[1][0] == 'S':
print(emp2_list[1])
※ lambda 표현식?
여러줄의 코드를 딱 한줄로 만들어주는 문법
오라클로 설명하면 "이름없는 함수"
예:
파이썬에서 함수를 생성하는 방법
def hap(x,y):
return x+y
print(hap(10,20))
def << 함수
(*콜론이 들어가는 친구: while, for, if, def)
hap << 함수이름
x,y << 매개변수 이름(다른걸로 변경 가능)
return x+y << x+y의 결과를 밖으로 출력해주겠다.
->>> print( ( lambda x,y : x+y) (10, 20) )
문제67.
아래와 같이 함수를 실행하면 결과가 아래와 같이 출력되는
함수를 생성하시오
보기: print(gop(10,20))
답:
def gop(x,y):
return x*y
print(gop(10,20))
문제68. 위의 코드를 lambda 표현식으로 나타내시오
↑
이름없는 함수 또는,
여러줄의 코드를 딱 한 줄로 표현하기 위한 문법
print( ( lambda x,y : x*y) (10, 20) )
**이전 문제처럼
hap, gop 같은 함수이름을 주지 않고
print 안에 넣어서
lambda 와 같은 임시이름 줘서 함수처리 한다.
→lambda 는 (lambda ) ( , ) 괄호괄호 작성한다.
→→200제 219페이지 참고
문제69. 오라클의 nvl 함수를 파이썬으로 구현하고
이름,커미션을 출력하는데
커미션이 null 인 사원들은 0으로 출력되게 하시오
nvl(emp_list[6],0)
def nvl(x,y): # nvl 이라는 함수 생성
if x is '': # x가 널이면
return y # y로 리턴해라
return x # (x가 널이 아니면) x로 리턴해라
import csv
file=open("d:\\csv\\emp_comm.csv", 'r')
emp_csv=csv.reader(file)
for emp_list in emp_csv:
print(emp_list[1], nvl(emp_list[6], 0) )
문제70. 위의 결과를 nvl 함수를 만들지 말고
lambda 표현식으로 구현하시오
import csv
file = open("d:\\csv\\emp_comm.csv","r")
emp_csv = csv.reader(file)
nvl_2 = lambda x,y:y if(x is '')else x
for emp_list in emp_csv:
print( emp_list[1], nvl_2( emp_list[6], 0) )
**같은식, 다른 표기**
def nvl(x,y):
if x is '':
return y
return x
||
nv=(lambda x,y: y(if x is '') else x
※코드설명
nvl_2 = lambda x,y : y if (x is '') else x
↑
if문을 한 줄로 표현하는 파이썬의 comprehension.
(뒤에 가서 배움)
lambda가 너무 길어서
nvl_2 라는 코드이름 지정
y if (x is '') else x
--> x가 null 일 때는 y를 출력하고
그렇지 않으면 x를 출력해라.(파이썬의 comprehension.)
for emp_list in emp_csv:
print( emp_list[1], nvl_2( emp_list[6], 0) )
↑
지정코드 가져다 이렇게 씀.
pandas를 이용한 코드
(이름 첫번째'S'인 사원_ lambda 이용)
import pandas as pd
emp=pd.read_csv("d:\\csv\\emp.csv")
result=emp['ename'].apply(lambda x:x[0]=='S')
result2=emp[['ename']][result==True]
print(result2)
**근데 중간에 print 넣으면 왜 true, false 나옴??
코드설명:
result=emp['ename'].apply(lambda x:x[0]=='S')
.apply : .apply( 함수명 또는 lambda 표현식)
lambda x는 앞의 ename 을 가리키고
x의 첫번째 글자가 S인 것을 나타냄
.apply는 S가 들어오는 이름을 훑어 true, false를 가려낸다.
이 값을
result2=emp[['ename']][result==True]
로 해주면 설정값을 뽑아올 수 있다.
즉, .apply 쓰려면 result1,2 가 와야한다.
pandas가 병렬처리라서 더 빠르나,
짧은식에 많은걸 담아내서 어려울 수 있다.
순수 파이썬으로 뽑아도 상관없다.
문제71. 이름의 두번째 철자가 M인 사원들의
이름을 pandas로 구현하시오(lambda 사용)
(pandas 지문이 잘 써질때까지 해봐야함)
import pandas as pd
emp=pd.read_csv("d:\\csv\\emp.csv")
result=emp['ename'].apply(lambda x:x[1]=='M')
result2=emp[['ename']][result==True]
print(result2)
result 아래 라인에
print(result) 쓰면
True, False 볼 수 있음.
최대공약수 반장답:
a = int( input('첫번째 수를 입력하시오 !'))
b = int( input('두번째 수를 입력하시오 !'))
dummy = 0
i = 1
c = 1
if a <= b:
dummy = a
a = b
b = dummy
while i < b: #b=18, a=24
i += 1 # i = 2
if a%i == 0: # 24%2 == 0
a = a / i # a=24/2=12
if b%i == 0: # 18%2== 9
b = b / i # b=18/2=9
c = c * i # c= 1*2=2
i = 1 # i=1(초기화) , a=12, b=9
print('결과 : 최대 공약수는', c, '입니다.')
점심시간 문제: 최대공약수 나올때까지
루프문의 아래의 식을 구현하시오
(밑에 첨부된 그림 중요 !! )
a = int( input('첫번째 수를 입력하시오 !'))
b = int( input('두번째 수를 입력하시오 !'))
dummy = 0
i = 1
c = 1
if a <= b: 18 <= 24
dummy = a
a = b
b = dummy
while i < b: 1 < 18, a= 24, b = 18
i = i + 1 i = 2
if a%i == 0: 24%2 = 0
a = a / i 24/2 = 12, a= 12
if b%i == 0: 18%2 = 0
b = b / i 18/2 = 9
c = c * i c = 1 * 2 = 2
i = 1 i = 1 , a=12, b=9, c= 2
print(c)
--------------------------------------------------------------
while i < b: 1 < 9, a= 12, b = 9
i = i + 1 i = 1 + 1, i = 2
if a%i == 0 12%2 = 0
a = a / i 12/2 = 6
if b%i == 0: 9/2 , b = 9
b = b / i
c = c * i
i = 1 i =1, a=6, b=9
print(c)
---------------------------------------------------------------
while i < b: # 1 < 9, a= 6, b = 9
i = i + 1 # i = 1 + 1, i = 2
if a%i == 0 # 6%2 == 0
a = a / i # 6/2 = 3
if b%i == 0: # 9/2 , b = 9
b = b / i
c = c * i
i = 1 # i =1, a=3, b=9
print(c)
-----------------------------------------------------
while i < b: # 1 < 9, a= 3, b = 9
i = i + 1 # i = 1 + 1, i = 2
if a%i == 0 # 3%2 !=0
a = a / i
if b%i == 0:
b = b / i
c = c * i
i = 1 # i =1, a=3, b=9
print(c)
--------------------------------------------------
while i < b: # 1 < 9, a= 3, b = 9, i=2
i = i + 1 # i = 2 + 1, i = 3
if a%i == 0 # 3%3 ==0
a = a / i # a= 3/3 = 1 , a=1
if b%i == 0: #9%3==0
b = b / i # b= 9/3=3, b=3
c = c * i # c = 1*3 , c=3
i = 1 # i =1, a=1, b=3
print(c)
------------------------------------------------------
while i < b: # 1 < 3, a= 1, b = 3, i=1
i = i + 1 # i = 1 + 1, i = 2
if a%i == 0 # 1%2 != 0
a = a / i
if b%i == 0:
b = b / i
c = c * i
i = 1
print(c)
-------------------------------------------------------------
돈거만 연두색
문제72.(미리내는 오늘의 마지막 문제)
두개의 숫자를 물어보게하고
두개의 숫자들 사이의 모든 숫자를 다 더한 값이
출력되게 하시오
a=int(input("숫자입력")) # 1
b=int(input("마지막숫자를 입력")) #10
print ------> 55입니다
a=int(input("숫자입력")) # 1
b=int(input("마지막숫자를 입력")) #10
sum=0
for i in range(1,11):
sum=sum+i
print(sum,'입니다')
■ 25. 비트 연산자 이해하기(&, |, ~, ^, >>, <<)
(중요하지 않아서 생략하심)
'python' 카테고리의 다른 글
5. 시퀀스 자료 (0) | 2019.03.24 |
---|---|
파이썬vs오라클vs판다스 연산자 (0) | 2019.03.24 |
3. None, 정수형, 실수형, 복소수형 (0) | 2019.03.24 |
2. if, for, while 문 (0) | 2019.03.24 |
1. 파이썬 변수생성,들여쓰기 (0) | 2019.03.24 |