✔️ 딕셔너리 value를 배열로 받기
id_list = [1,2,3,4]
dicReports = {id: [] for id in id_list}
# 실행 결과 : [1:[], 2:[], 3:[], 4:[]]
✔️ BackTracking 구현하기
import copy
arr = ['A', 'B', 'C', 'D', 'E']
result = []
total_result = []
def strcombination(idx):
for idx in range(idx, len(arr)):
result.append(arr[idx])
total_result.append(copy.deepcopy(result)) # 깊은 복사
strcombination(idx + 1)
result.remove(arr[idx])
strcombination(0)
print('\n'.join(list(map(str, total_result))))
list
에 저장하기
결과
['A']
['A', 'B']
['A', 'B', 'C']
['A', 'B', 'C', 'D']
['A', 'B', 'C', 'D', 'E']
['A', 'B', 'C', 'E']
['A', 'B', 'D']
['A', 'B', 'D', 'E']
['A', 'B', 'E']
['A', 'C']
['A', 'C', 'D']
['A', 'C', 'D', 'E']
['A', 'C', 'E']
['A', 'D']
['A', 'D', 'E']
['A', 'E']
['B']
['B', 'C']
['B', 'C', 'D']
['B', 'C', 'D', 'E']
['B', 'C', 'E']
['B', 'D']
['B', 'D', 'E']
['B', 'E']
['C']
['C', 'D']
['C', 'D', 'E']
['C', 'E']
['D']
['D', 'E']
['E']
✔️ 순열 vs 조합
- 순열은 순서가 없다.
- 조합은 순서가 있다.
✔️ 조합과 Counter라이브러리를 같이 사용하다.
from itertools import combinations
from collections import Counter
course = [2, 3, 4]
orders = ["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"]
for c in course:
temp = []
for order in orders:
combi = combinations(sorted(order), c)
temp += combi
counter = Counter(temp)
print(counter)
combinations
) 구한다.temp += combi
를 통해 추가temp
에 저장되어 있는 문자열을 기반으로 횟수를 구한다.
Counter({('A', 'C'): 4, ('C', 'D'): 3, ('C', 'E'): 3, ('D', 'E'): 3, ('B', 'C'): 2, ('B', 'F'): 2, ('B', 'G'): 2, ('C', 'F'): 2, ('C', 'G'): 2, ('F', 'G'): 2, ('A', 'D'): 2, ('A', 'E'): 2, ('A', 'B'): 1, ('A', 'F'): 1, ('A', 'G'): 1, ('A', 'H'): 1, ('C', 'H'): 1, ('D', 'H'): 1, ('E', 'H'): 1})
Counter({('C', 'D', 'E'): 3, ('B', 'C', 'F'): 2, ('B', 'C', 'G'): 2, ('B', 'F', 'G'): 2, ('C', 'F', 'G'): 2, ('A', 'C', 'D'): 2, ('A', 'C', 'E'): 2, ('A', 'D', 'E'): 2, ('A', 'B', 'C'): 1, ('A', 'B', 'F'): 1, ('A', 'B', 'G'): 1, ('A', 'C', 'F'): 1, ('A', 'C', 'G'): 1, ('A', 'F', 'G'): 1, ('A', 'C', 'H'): 1, ('A', 'D', 'H'): 1, ('A', 'E', 'H'): 1, ('C', 'D', 'H'): 1, ('C', 'E', 'H'): 1, ('D', 'E', 'H'): 1})
Counter({('B', 'C', 'F', 'G'): 2, ('A', 'C', 'D', 'E'): 2, ('A', 'B', 'C', 'F'): 1, ('A', 'B', 'C', 'G'): 1, ('A', 'B', 'F', 'G'): 1, ('A', 'C', 'F', 'G'): 1, ('A', 'C', 'D', 'H'): 1, ('A', 'C', 'E', 'H'): 1, ('A', 'D', 'E', 'H'): 1, ('C', 'D', 'E', 'H'): 1})
eval
함수를 사용하면, 문자열안에서 계산을 할 수 있다.
a = '1+2+3'
print(eval(a)) # 6
lstrip
: 문자열에서 왼쪽 끝에 있는 지정한 알파벳을 제거하고 싶을 때
rstrip
: 문자열에서 오른쪽 끝에 있는 지정한 알파벳을 제거하고 싶을 때
s = '{{,{,},}}'
print(s.lstrip('{')) # ,{,},}}
print(s.rstrip('}')) # {{,{,},
문자열 길이에 따라 정렬하고 싶을 때
arr = ['123', 'absss', '12', 'sssssssss', 't', '2']
arr.sort(key=len)
print(arr) # ['t', '2', '12', '123', 'absss', 'sssssssss']
zip
list 배열에서 유용하게 사용할 수 있다.
i
와 i+1
인덱스 값 비교할 때
arr = ["12","123","1235","567","88"]
for p1, p2 in zip(arr, arr[1:]):
print(p1, p2)
12 123
123 1235
1235 567
567 88
✔️ startswith
a.startswith(b)
: a 문자열 앞에 b문자열이 있는지 확인할 때 사용한다.
a = '123'
b = '1'
print(a.startswith(b))
True
✔️ enumerate
- 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환
t = [1, 5, 7, 33, 39, 52]
for p in enumerate(t):
print(p)
(0, 1)
(1, 5)
(2, 7)
(3, 33)
(4, 39)
(5, 52)
✔️ 딕셔너리를 리스트로 변경한 후, 정렬 하기
dic = {'Abcdde': [401,1], 'Brds':[200,1],'brds':[200,1], 'efg': [700,4], 'Efg':[103, 4]}
# dictionary를 list으로 변경하기
listarr = list(dic.items())
# 리스트 lambda 식으로 정렬하기
listarr.sort(key=lambda x: (x[1][1], x[1][0], x[0]))
print(listarr)
결과
[('Brds', [200, 1]), ('brds', [200, 1]), ('Abcdde', [401, 1]), ('Efg', [103, 4]), ('efg', [700, 4])]
key와 value로 저장되어 있는 딕셔너리가 있다.
삭제하고자 하는 데이터가 list에 저장되어 있을 때, 이를 이용해 딕셔너리 key 값을 삭제한다.
ex) key가 2의 배수를 삭제하고 싶다.
listarr = {2:1,3:2,4:3,5:4,6:4,10:3,13:2, 17:1, 18:2, 19:5}
delete = []
# key가 2의 배수인 것들을 제거하고 싶다.
for data in range(1, 20):
if not data % 2:
delete.append(data)
for in_delete in delete:
if in_delete in listarr:
listarr.pop(in_delete)
print(listarr)
결과
{3: 2, 5: 4, 13: 2, 17: 1, 19: 5}