일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- FOREIGN KEY
- ceil
- SUM()
- enumerate
- floor
- convention
- 네이밍
- python
- 소수
- 자료구조
- 외래키
- mysql
- datetime
- itertools
- Codeforces
- timestamp
- Dictionary
- BOJ
- 세그먼트 트리
- 리스트 컴프리헨션
- lower_case_table_names
- project euler
- 2557
- 파이썬
- 딕셔너리
- list comprehension
- 에라토스테네스의 체
- SUM
- 큰 수 나누기
- flask
- Today
- Total
목록언어 공부 기록/python (18)
늒네 기록
파이썬에서 리스트 안에 있는 값들로 작업을 할때 다음과 같은 두 가지 접근 방법이 있을 것이다. 1 2 3 4 5 6 7 8 9 10 l = ['x', 'y', 'z'] # list에 인덱스로 접근 for i in range(len(l)): print(l[i]) # list 아이템에 직접 접근 for s in l: print(s) cs 하나는 인덱스로 접근하는 방법, 하나는 아이템에 직접 접근하는 방법. 첫 번째 방법은 내가 몇 번째 인덱스 가지고 작업하고 있는지를 기준으로 생각하기 쉬운 반면, 리스트가 들고있는 아이템 자체로 코드를 짠다는 생각을 하기 어렵다. 예를 들어, 아래와 같은 코드가 있다고 하면, 1 2 3 4 5 6 7 8 9 10 group = ['John', 'Kay', 'Sam'] # ..
평소에 제일 많이 접하게 되는 sum() 함수 사용법은 다음과 같을 것이다. l = [1, 2, 3, 4] print(sum(l)) # 10 이때 sum의 역할은 리스트 l 안에 있는 정수들을 전부 더해준다. 그런데, sum에 두번째 인자를 넣을 수 있다. 두 번째 인자는 최초의 변수 역할을 해주는데, 아래의 코드를 보면 좀 더 명확하게 이해할 수 있다. x = 5 l = [1, 2, 3, 4] for num in l: x+=num print(x) # 15 y = 5 print(sum(l, y)) # 15 print(y) # 5 sum()함수가 주어진 이터레이터에 있는 값들을 모두 더해주는 거라면, +가 정의된 다른 타입들도 넣을 수 있는 것이 아닐까 의문을 가질 수 있다. 예를 들어, 1) string..
다음과 같은 리스트를 만들고 싶다면 어떻게 해야할까? 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 이런 식의 문제가 발생할 수 있으니, 주의할 것. 나중에 시간 되면 문제 발생 이유도 정리하고, 두 계산에 걸리는 시간 비교도 해볼 예정이다.