순서는 그냥 쓰는대로 썼음
1. lambda
수업듣고 이해하게 됐음. 함수를 표현식형태로 다른곳에 인자로 쓰기위한 느낌.
lambda 매개변수 리턴값 뒤에 조건문 오던 말던.
sorted의 key값으로 쓰면 매우 유용함. sorted(list, lambda x: (x[1],x[0]),reverse=True)
=> 2번째 열, 1번째 열 순으로 이중정렬을 할수도있음.
sorted(dict,lambda x: dict[x]/[2])로 key값 대신서 index값 같고 key다른 여러값 동시에 뽑아 리스트로 만들수도있음.
2. map,reduce,filter
앞에 설명한 lambda를 쓰기 가장 좋은 함수를 인자로 받는 메소드들.
map,filter은 (함수,리스트)를 인자로 받고 reduce는 (함수,시퀀스)를 인자로 받음.
map은 리스트 인자 각각에 함수 적용.
filter은 함수 조건에 맞는 요소만 걸러서 리턴해줌.
둘다 기본값은 객체로 반환되니 리스트로 돌리기 위해선 list()로 감싸주어야 함.
reduce는 functools에 속한 메소드로 뭔가 유용한데 쓰기 어려움.
기본적으로는 연산값을 앞에서부터 시작해서 맨끝에 이를때까지 순차적으로 연산한 함수의 결과값을 반환함.
각자계산, 조건계산인 map,filter랑은 다르게 좀 과격한 느낌이 있음. (((a+b)+c)+d)이런느낌으로 retern값을 시퀀스(문자열, 리스트, 튜 플의 -1인덱스까지 돌려줌.)
>>> reduce(lambda x, y: y + x, 'abcde')
'edcba'
3. 진법 변환
- int(string,진법수) => 10진법으로 변함. ex. int('111',2) = 7
- bin,oct,hex => 각 2진법, 8진법, 16진법. 앞에 0b, 0o, 0x 붙으니 쓰려면 변환한 값에 [2:]붙혀야 숫자만 나옴
- 10진수 -> n진수
import string
tmp = string.digits+string.ascii_lowercase
def convert(num, base) :
q, r = divmod(num, base)
if q == 0 :
return tmp[r]
else :
return convert(q, base) + tmp[r]
이거짜서 하면됨.
convert(10,2)하면 해당 진법으로 바뀜. 16진법이상도 가능.
4. 패킹 언패킹
- 패킹 반환값을 여러개 한번에 주어 하나에 담으면 자동으로 튜플로 들어감
- 하나의 튜플을 여러 변수에 각 할당시키면 언패킹.
5.표준 라이브러리
- itertools - permutations, combinations, product(중복순열) (n의 r승 ''ㅠ''모양), combinations_with_replacement중복허용한 조합.
- heapq -heapq, heappush, heappop
- bisect - bisect, left, right(잘 모름)
- collections - defaultdict, deque, Counter([배열])-> 모든 원소 갯수세서 dict객체로 반환 => dict(Counter([배열]))로 씀.
- math- gcd(a,b) => 최대공약수.
이 다섯개는 따로 찾아보고 써먹기.
6. Dictionary
hash table
.keys() -> list에 key들 들어있는 객체 반환
.get(key) -> value값 조회 key가 없을 시 에러 안나오고 None나옴.
.items() ->list안의 튜플쌍 객체 반환
.update -> 삽입
.pop(key) => key제거함과 동시에 value return
.defaultdict -> 존재하지 않는 키 접근 시 error대신 default값으로 생성.
.Ordereddict
.Counter -> 리스트 값의 갯수 집계해 딕셔너리로 리턴.
- list, dict comprehention
- {x:[] for x in range(1,41)} -> key값 1~40까지 빈배열을 value로 가지는 dictionary생성.
- zip(a,b) -> a,b는 리터럴 한 자료형 두개 리스트 안의 튜플 쌍으로 인덱스 같은 값끼리 묶어서 반환.
- => 짝짓기 할때 유용
7. Immutable 세가지
튜플, frozenset(변경불가 셋), collections의
namedtuple(type명,필드목록(안에 어떤 속성값들을 지닐껀지.))
8. 순열 조합 하드코드
def permute(arr):
result = [arr[:]]
c = [0] * len(arr)
i = 0
while i < len(arr):
if c[i] < i:
if i % 2 == 0:
arr[0], arr[i] = arr[i], arr[0]
else:
arr[c[i]], arr[i] = arr[i], arr[c[i]]
result.append(arr[:])
c[i] += 1
i = 0
else:
c[i] = 0
i += 1
return result
# 재귀
def perm(lis, n):
result = []
if n > len(lis):
return result
if n == 1:
for li in lis:
result.append([li])
elif n > 1:
for i in range(len(lis)):
tmp = [i for i in lis]
tmp.remove(lis[i])
for j in perm(tmp, n-1):
result.append([lis[i]]+j)
return result
n = int(input())
lis = list(i for i in range(1, n+1))
for li in perm(lis,n):
print(' '.join(list(map(str, li))))
위에는 둘다 순열, depth조절하면 조합으로 바꿀수있음.
9. visted를 dict로 짜는 이유.
def bfs_queue(graph, start):
visited = {}
q = Queue()
q.put(start)
while q.qsize() > 0:
n = q.get()
if n not in visited:
visited[n] = True
for adj in graph[n]:
q.put(adj)
return list(visited.keys())
not in visited를 순회로 접근이 아닌 hash로 접근하기 위해 visited를 dict나 set(인덱싱하지 않는 자료형들)로 가는게 좋음.
10. stack dfs
def dfs(graph, start):
visited = []
stack = [start]
while stack:
n = stack.pop()
if n not in visited:
visited.append(n)
stack += graph[n] - set(visited)
return visited
DFS는 재귀로 많이들 하지만 원래 stack으로도 구현하는 알고리즘.
11. 숫자 문자열 앞에 0채우는 A.zfill(자리수)
A문자열을 x자리수만큼 앞에 0을 채워준다.
12. replace(a,b,숫자) : a를 b로 몇번 바꾼다.
13. 배열의 회전
배열의 회전은 단순히 잘라서 좌우를 바꾸고 합치는 경우와 같다는걸 이해해야한다.
[1,2,3,4,5]
[1,2,3,4] + [5]
[5] + [1,2,3,4]
위와같은 매커니즘. 슬라이싱을 이용한 방법이 많이 쓰인다.
추가적으로 슬라이싱 후 각각 반전(reverse)시키고 원 자리에 붙힌 후 전체를 반전시키는 방법도 있다.
[1,2,3,4,5]
[1,2,3] + [4,5]
[3,2,1] + [5,4]
[3,2,1,5,4]
[4,5,1,2,3]
+++deque에서만 쓸 수 잇는 rotate라는 메소드도 구현되어있다.
배열A.rotate(1) 1하면 오른쪽으로 -1하면 왼쪽으로 회전.
숫자를 늘리면 그만큼 자동으로 회전된다.
'practivceAlgorithm > PYTHON 기능연습' 카테고리의 다른 글
[Python] zfill과 rjust : 문자의 자릿수를 맞춰주자! (0) | 2021.09.01 |
---|---|
[문자열 뒤집기] 문자열 슬라이싱 (0) | 2021.08.18 |
[Python] 특정 문자열 찾기.(find응용) (0) | 2021.07.17 |
[Python] set 알아야 할 점 총 정리. (0) | 2021.07.15 |
[Python] itertools 순열, 조합 구현. (0) | 2021.07.15 |