일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- datetime
- project euler
- 2557
- ceil
- 큰 수 나누기
- 세그먼트 트리
- 네이밍
- flask
- lower_case_table_names
- mysql
- SUM()
- 에라토스테네스의 체
- enumerate
- Codeforces
- timestamp
- SUM
- floor
- 파이썬
- Dictionary
- 리스트 컴프리헨션
- 소수
- itertools
- 자료구조
- 외래키
- FOREIGN KEY
- 딕셔너리
- convention
- python
- BOJ
- list comprehension
- Today
- Total
목록파이썬 (6)
늒네 기록
다음과 같은 리스트를 만들고 싶다면 어떻게 해야할까? l = [ [0], [0,1], [0,1,2], [0,1,2,3], [0,1,2,3,4] ] 이전에 쓴 list comprehension 글에서 사용한 방법을 각 아이템마다 적용해보면 다음과 같다. l = [ [i for i in range(1)], [i for i in range(2)], [i for i in range(3)], [i for i in range(4)], [i for i in range(5)] ] 그런데, 여기에도 규칙이 있지 않은가? range 안에 있는 숫자가 [1,2,3,4,5] 안에 있는 숫자로, 너무나도 range로 표현하면 좋겠다는 생각이 든다. 저걸 j for j in range(1,6)으로 표현한다고 하고, 저 리스트 자..
간단한 실험. s='1234'일때 list(s)값은? s = '1234' print(list(s)) # ['1', '2', '3', '4'] 간단하게 각 글자를 하나씩 리스트 아이템으로 분리해버렸다! 비슷하게 set(s)를 해도 작동한다. 이 성질을 활용하면 project euler 32번에 쉽게 접근할 수 있다. 내용은 [PE] Project Euler 32 글에 이어서.
문제 풀때 get함수를 아래와 같이 사용할 때도 종종 있다. l = [1,2,2,3,1,2,3,1,4,2,3,4,2,1,2,3,4,1] x = {} for i in l: x[i] = x[i]+1 if x.get(i) else 1 print(x) # {1: 5, 2: 6, 3: 4, 4: 3} 물론, x.get(i) 대신 i in x로 쓰는 것이 더 짧고 직관적이긴 하지만...
파이썬에서 딕셔너리를 다룰 때 종종 마주칠 수 있는 상황. x = {} for i in range(5): x[i] = i*i # x = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} for i in range(10): print(f'x[{i}] = {x[i]}') #x[0] = 0 #x[1] = 1 #x[2] = 4 #x[3] = 9 #x[4] = 16 #Traceback (most recent call last): # File "cf.py", line 8, in # print(f'x[{i}] = {x[i]}') #KeyError: 5 x 안에 없는 키(위의 경우, 5)를 가지고 불러오려고 하는 경우, KeyError가 발생하며 돌던 것이 죽어버린다. 그렇다면, 처음부터 안에 들어있는 key들..
[7, 17, ..., 87, 97]을 만들고 싶으면 어떻게 해야 할까? 1. 빈 리스트를 만들고 하나씩 더한다. l = [] for i in range(10): l.append(i*10+7) print(l) # [7, 17, 27, 37, 47, 57, 67, 77, 87, 97] 2. 리스트 컴프리헨션 l = [i*10+7 for i in range(10)] print(l) #[7, 17, 27, 37, 47, 57, 67, 77, 87, 97] 당장 가독성 측면에서 l에 값 하나씩 집어넣는 것보다 l을 이루고 있는 값이 어떻게 만들어졌는지 보는 편이 이해하기에 훨씬 수월한데다가, 코드를 작성하는 단계에서도 생각한 걸 더 바로 옮길 수 있고, 심지어 더 짧다.
문제 풀다가 멍청한 실수를 하고선 기록해둔다. 큰 수에 대해서, a//b의 결과와 int(a/b)의 다를 수 있는데, 이때 int(a/b)가 원하는 값을 리턴하지 않을 수 있다. 예를 들어, stackoverflow.com/a/56470206 링크에서 설명하듯이, - > int(755349677599789174/2) - > 377674838799894592 #wrong answer - > 755349677599789174 //2 - > 377674838799894587 #correct answer 이런 식의 문제가 발생할 수 있으니, 주의할 것. 나중에 시간 되면 문제 발생 이유도 정리하고, 두 계산에 걸리는 시간 비교도 해볼 예정이다.