일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 스트라토캐스터
- 적용함수
- case문
- 로스티드메이플
- Decode
- Asato
- Prs
- 텔레
- 커스텀
- group by
- 펜더
- 오더
- Python
- 로즈우드
- 메서드
- 파이썬
- 메이플
- SQL
- oracle
- 오라클
- MateusAsato
- 서브쿼리
- to_date
- 쏜버커
- 리스트
- 조인
- Suhr
- 존써
- ansi표준
- 논리연산자
- Today
- Total
Big Bro's Studying Archive
Python 기초 3 : 리스트 형식의 이해, lambda 람다 함수와 적용함수 map 본문
@author: 백승윤
3번째 시간 마음 가짐
리스트형식과 산술,논리연산자의 이해
리스트형식과 R 벡터 형식의 차이를 생각하며 공부하다보면 좀 더 이해가 쉬울 듯
lambda 함수를 통한 함수 생성 및 리스트 적용함수의 이해
R의 적용함수의 역활과의 유사점과 차이점
리스트
R에서 벡터처럼 여러개의 값을 하나로 묶기 위한 최소 단위 자료구조
1차원 형식
중첩구조 가능(리스트 안에 리스트 삽입이 가능)
서로 다른 데이터 타입 입력 가능
1. 생성
L1 = [1,2,3]
L2 = [1,'2',3] ; L2
L3 = [1,2,[3,4]] ; L3
L4 = [1,2,3,4,5,6]
2. 색인
L1[0] # 정수(position) 색인 가능
L1[0:2] # 슬라이스 색인 가능. 슬라이스 : 연속 범위
L1[1:] # 두번째 값부터 끝값까지
L1[:1] # 첫번째 값부터 두번째 값까지
L1[[0,2]] # 그러나 R의 v1[c(1,2)] 처럼 리스트(벡터)를 전달하는 색인은 되지 않는다.
# list indices must be integers or slices, not list
L3[2][0] # L3에서 3이라는 원소 뽑기
L1[-1] # Reverse indexing (R은 제외, Python은 뒤에서 첫번째 원소 뽑기)
L4[::2] # [1, 3, 5]. R과는 다르게 by값 설정 가능 list[처음값:끝값:by값]
3. 수정
L1[0] = 10; L1 # Out[167]: [10, 2, 3] # v1[1] <- 10 in R
L1[1] = [20,30] ; L1 # 특정 원소 하나에 여러개를 입력하면 그 원소에 여러개가 들어감
L1[1:3] = [20,30] ; L1 # 갯수가 일치하면 각각 들어감
4. 확장
L1.append(40)자 #(O) # L1 <- c(L1,40) in R
# v1 <- append(v1,4) in
L1[4] = 50 #(X) # v1[4] <- 4 in R. R에서는 새로운 위치에도
# 값 할당할 수 있었으나 Python에서는 불가
L1 + L2
L1 + [4] # list + list 하면 양 리스트의 원소가 추가되므로 이렇게 활용 수 할있다.
L1.extend([5]) # 리스트 원소 추가2
L1 * 3 # L1이 세개만큼 확장 됨
5. 삭제
del(L1[3]) ; L1 # 원소의 삭제
# 중간 위치 원소 삭제 가능
# R은 벡터의 중간값을 삭제할 수 없는데 python에서는 된다.
del(L1) # 객체 자체 삭제
L2 = [] # 객체의 원소만 삭제
Oracle의 Drop, truncate의 관계를 적용하여 생각해보자
산술연산자
산술 연산자의 종류
a = 3 # 대입연산자
a = 5 + 3 # 더하기
a = 5 - 3 # 빼기
a = 5 * 3 # 곱하기
a = 5 / 3 # 나누기
a = 5 //3 # 나누기 한 값의 몫 (%/% in R)
a = 5 % 3 # 나누기 한 값의 나머지 (%% in R)
a = 5** 3 # 제곱 (^ in R)
[데이터 다루기 - 연산자 실습문제]
돈을 입력하면 5만원,1만원,5천원,천원 지폐로 교환하는 프로그램 작성
풀이 1
a1 = int(input('지폐로 교환할 돈은 얼마? : '))
a2 = a1 // 50000
a3 = a1 % 50000 // 10000
a4 = a1 % 10000 // 5000
a5 = a1 % 5000 // 1000
a6 = a1 % 1000
print('50000원 짜리 %d장 \n 10000원짜리 %d장 \n 5000원짜리 %d장 \n 1000원짜리 %d장 \n 지폐로 바꾸지 못한 돈 %d원' %
(a2,a3,a4,a5,a6))
풀이2 (for문을 입히기 좋은 문법)
money = int(input('지폐로 교환할 돈은 얼마? : '))
q50 = money // 50000
money = money % 50000
q10 = money // 10000
money = money % 10000
q5 = money // 5000
money = money % 5000
q1 = money // 1000
money = money % 1000
print('50000원짜리 ==> %2d 장' % q50)
print('10000원짜리 ==> %2d 장' % q10)
print('5000원짜리 ==> %2d 장' % q5)
print('1000원짜리 ==> %2d 장' % q1)
print('못 바꾼 돈 ==> %2d 장' % money)
논리 연산자
v1 = 10
(v1 > 5) & (v1 < 15)
(v1 > 5) and (v1 < 15)
(v1 > 5) | (v1 < 15)
(v1 > 5) or (v1 < 15) # 모두 True 출력
!(v1 > 5) # in R. python에서는 안됨
not(v1 > 5) # in python.
~(v1 > 5) # -2를 출력
lambda
사용자 정의 함수(축약형)
1) 기존 함수 선언 방식
def 함수명 :
2) lambda의 선언 방식
lambda input : output
예제) 입력된 값의 10% 증가값을 리턴하는 함수 생성
f1 = lambda x : x*1.1
f1() #Argument 뜨는거 <3_2>
f1(10) <3-3>
예제) 두 수를 입력받아 두수의 합을 리턴
f2 = lambda x, y : x + y
f2 = lambda x, y = 0 : x + y # 인자의 기본 값 선언 가능
f2 = lambda x = 0, y : x + y # 불가. 앞의 인자가 디폴트가 선언되면 그 다음에 나오는 모든 인자는
# 디폴트값이 있어야 하기 때문에 디폴트값을 선언할 인자는
# 가장 뒤로 빼주는 것이 좋다.
f2(1, 10)
lambda의 단점
뒤쪽에는 간단한 return만 가능
if문, for문등 조건문 반복문 처리는 불가능 (해보니까 가능하던데)
-> 적용함수를 통한 맵핑 처리로 해결
리스트의 벡터연산(적용함수)
L1 + 1 # 벡터연산(각 원소의 반복적용)불가
L1 * 1.1 # 마찬가지로 불가
f1(L1)
맵핑 방법
map(함수, 적용대상)
예제) L1에 1.1을 곱한 결과 리턴
map(f1, L1) # Out[214]: <map at 0x20ea26fd288>
list(map(f1, L1)) # Out[215]: [11.0, 22.0, 33.0]
# 특성상 리스트로 담아줘야지만 결과를 출력할 수 있다.
예제) L1 + L11의 결과 리턴
L11 = [1,2,3,4]
L1 + L11 # 리스트가 합쳐짐. 산술연산은 안됨
list(map(f2, L1, L11)) # Out[218]: [11, 22, 33]
# 가장 적은 갯수의 리스트를 기준으로 출력해주는 듯...
[ 참고 - R에서의 적용함수 ]
map은 mapply와 가깝다.
sapply(L1, f1) # in R
mapply(f1, L1) # in R
sapply(L1, f1, L11) # in R
mapply(f1, L1, L11) # in R
map? #help() in R
[ 연습 문제 ]
다음의 리스트를 생성
L1 = [1,2,3,4]
L2 = [10,20,30,40]
L3 = [100,200,300]
L4 = ['서울','부산','대전','전주']
L5 = ['abc@naver.com','a123@hanmail.net']
- L2의 L1승 출력, 10^1, 20^2, 30^3, 40^4
f1 = lambda x, y : x ** y list(map(f1, L2, L1))
- L4의 값에 "시"를 붙여 출력
f2 = lambda x : x + '시' list(map(f2, L4))
- L5에서 이메일 아이디만 출력
[ 2차원 형식 리스트 ]실제 2차원은 아니고 2차원의 형식으로 출력'abc@naver.com'.split('@')[0] f3 = lambda x : x.split('@')[0] list(map(f3, L5))
L1 = [[1,2,3],[4,5,6],[7,8,9]] len(L1) # 3
L1[1][0]
## 다음의 문제를 lambda + map문을 사용하여 출력
1) ename = ['smith','allen','king'] 에서 s로 시작하는 여부 출력
```python
f1 = lambda x : x.startswith('s')
ename = ['smith','allen','king']
list(map(f1, ename))
[Tip 리스트의 벡터활용]
ename[list(map(f1, ename))] # 불가
Series(ename)[list(map(f1, ename))] # 가능
2) jumin = ['8812111223928','8905042323343','90050612343432'] 에서
성별 숫자 출력
jumin = ['8812111223928','8905042323343','90050612343432']
f2 = lambda x : x[6]
list(map(f2, jumin))
3) ename에서 smith 또는 allen 인지 여부 출력 [True,True,False]
f3 = lambda x : x.startswith('smith') or x.startswith('allen')
list(map(f3, ename))
4) tel=['02)345-4958','031)334-0948','055)394-9050','063)473-3853'] 에서
다음과 같이 국번 XXX 치환 (02)345-4958 => 02)XXX-4958)
tel=['02)345-4958','031)334-0948','055)394-9050','063)473-3853']
f4 = lambda x : x.replace(x[x.find(')')+1:x.find('-')],'XXX')
list(map(f4, tel))
5) vid=['2007(1)','2007(2)','2007(3)','2007(4)']에서
각각 년도와 분기를 따로 저장
기존 => 년도 분기
2007(1) 2007 1
2007(2) 2007 2
vid=['2007(1)','2007(2)','2007(3)','2007(4)']
f5 = lambda x : x.replace(')','').split('(')
list(map(f5, vid))
'Big Data展' 카테고리의 다른 글
Python 기초 5 : 딕셔너리와 튜플, 그리고 반복문 연습 (0) | 2020.04.10 |
---|---|
Python 기초 4 : 리스트의 벡터활용 메서드와 함수, for, while, if 문을 활용한 다양한 문제풀이 (0) | 2020.04.09 |
SQL by Orcale # 4. decode, case문, group by절과 having절 (0) | 2020.04.08 |
Python 기초 1 : 모듈과 함수 불러오기, 메서드와 리스트 형식의 이해 (0) | 2020.04.07 |
Oracle을 활용한 SQL 입문 # 3. 날짜함수, 형변환함수, 조건문 (0) | 2020.04.02 |