range(2,n+1,2)
로 짝수만 구할 수 있다.list.reverse()
하면 반환 값 없이 list를 뒤집는다.list[::-1]
와 같이 슬라이싱에서 증가량을 이용한 방법이 있다.[i for i in list]
[i for i in list if i%2==0]
[i,j for i in list_1 for j in list_2]
이중 for문도 지원한다. 왼쪽의 for문이 먼저 실행됨[i if i%2==0 else 0 for i in list]
else까지 사용한다면 for문 앞에 if-else문을 적어줘야함divmod(x, n)
을 하면 x를 n으로 나눈 몫과 나머지를 한 번에 반환한다. 하지만 작은 수에서는 divmod가 x//n, x%n을 따로 하는 것보다 시간이 더 걸린다 하니 큰 수에서 사용하는 것이 좋겠다.sum(1 for i in list if i>height)
list.count(x)
1 if n%2==0 else 0
와 같이 작성해왔는데, 그러지 말고 int(n%2==0)
으로 쓰면 더 간단하다. 가독성은 모르겠지만...n << t
n에 2**t를 곱한 값을 의미한다.n >> t
n을 2**t로 나눈 값을 의미한다.컴퓨터엔 값이 2진수로 저장되기 때문에 <<, >> 연산자로 비트를 밀어주거나 당겨주면 값이 2배씩 늘어나거나 1/2씩 줄어든다.
list(range(1,n,2))
set(문자열)
은 문자열의 각 요소가 원소로 구성된 집합을 반환한다. (중복 제거)s1&s2
는 s1과 s2의 교집합을 의미한다. (intersection 함수)s1|s2
는 s1과 s2의 합집합을 의미한다. (union 함수)s1-s2
는 s1과 s2의 차집합을 의미한다. (difference 함수)is_integer()은 x.is_integer()
와 같이 사용하고 이는 타입 확인이 아닌 형태 확인이다.
즉 x가 3.0, 즉 float여도 True를 반환한다.
range(1, int(n**0.5+1))
의 범위에서 나눠지는지 확인하면 된다.''.join([i for i in str if i not in 'aeiou'])
in 문자열
이 가능하다는 걸 알고있자.''.join(sorted(str))
list.index(x)
str.find(x)
와 같이 사용할 수 있다."We are the world"
['W', 'e', ' ', 'a', 'r', 'e', ' ', 't', 'h', 'e', ' ', 'w', 'o', 'r', 'l', 'd']
result = ""
for i in my_string:
if i not in result:
result+=i
return result
리스트에 함수를 일괄 적용하는 방법
l = [1,2,3,4,5]
list(map(int, l)) => ['1','2','3','4','5']
하지만 map은 iterator 객체를 반환하니 list로 감싸서 반환해야한다.
from math import factorial
factorial(n)
from math import comb
comb(m,n)
m개 중 n개 뽑는 경우의 수! => 조합. math 패키지에 있다.
from math import gcd
greatest_common_divisor = gcd(a,b)
from collections import Counter
x = [1,1,2,3,3,6,8,9,9]
### 1)
[i for i in x if x.count(i)==1]
### 2)
[i for i in set(x) if x.count(i)==1]
### 3)
counts = Counter(x)
[i for i,j in counts.items() if j==1]
str.split()
와같이 사용한다면 공백(몇개든 상관없이) 기준으로 분리된다. 만약 str이 3 23 567
이면 [3,23,567]
이 반환된다.array.sort(key=lambda x: (abs(n-x), x))
sorted(numlist, key = lambda x: (abs(n-x), -x))
참고 문제
이렇게 하면 numlist란 리스트를 abs(n-x)로 1차 정렬하고 x값을 기준으로 내림차순 정렬한다.
정렬 조건(?)이 두개 이상이라면 꼭 괄호로 묶어주는 거 잊지말기..!
[1,2,5]
의 list를 고대로 문자열로 만들고싶다면 str(list)
하면 끝..! 그러면 "[1,2,5]"
가 되므로 이대로 사용하면 된다...만약 리스트의 값들을 모두 하나의 문자열로 합치고싶다면, join을 사용하면 될듯하다. 만약 리스트의 원소들이 str이 아니라면 map도 같이 써줘야겠지.
''.join(map(str, list))
int(binary_value, 2)
(이때 binary_value는 str)bin(decimal)
(이때 decimal은 int) 0b1010
와 같은식. 그렇기 때문에 우리가 직접 이진수를 다루기 위해선 bin(decimal)[2:]
와같이 사용def solution(n):
d = 2
answer = set()
while d<=n**0.5:
if n%d!=0:
d+=1
else:
answer.add(d)
n = n//d
if n>1:
answer.add(n)
return sorted(answer)
여기서 효율성을 높이기 위해서 n**0.5보다 작거나 같은 값을 기준으로 뒀다.
그랬기때문에 마지막에 n>1일때 n도 소인수분해 값에 넣어줘야한다.
이건 거의 공식처럼 외우고있어야겠다.
슬라이싱의 경우 범위를 초과해도 에러가 나지 않는다.
즉 a = [1,5,3,6,2]
이 있을 때, a[3:6]
해도 에러없이 [6,2]
가 출력될 뿐이다.
그러니까 인덱스 3에서 끝까지의 값을 가져오기 위해 a[3:5]
로 슬라이싱해도 에러가 나지 않는것이다.
def solution(numbers, k):
return numbers[2 * (k - 1) % len(numbers)]
이 문제를 풀면서 깨달?은건데...
해당 문제에서 1명을 건너뛰고 공을 던지니 2를 곱해주고
인덱스 0부터 공을 던지기 때문에 k-1을 해주고
%len(list)
를 이용해서 리스트의 인덱스를 넘는 값을 처리해준다.
이렇게 간단하게 처리가 가능하다니!
인덱싱에 대해서 좀 더 공부할 필요가 있겠다.
min, max로 좌표를 벗어나지 않도록 조절해줄 수 있다. 해당 문제에서 아주 유용하게 사용된다.
def solution(keyinput, board):
result = [0,0]
max_x, max_y = board[0]//2, board[1]//2
for key in keyinput:
if key=='left':
result[0] = max(result[0]-1, -max_x)
elif key=='right':
result[0] = min(result[0]+1, max_x)
elif key=='up':
result[1] = min(result[1]+1, max_y)
else:
result[1] = max(result[1]-1, -max_y)
return result
이 문제도 좌표를 이용하는 문제인데, 여기 적용할 수 있지 않을까 싶다.
l = [[1,2],[2,3],[3,4]]
sum(l, [])
이렇게 하면, []+[1,2]+[2,3]+[3,4]
와 같은 연산이 일어나기때문에 1차원 리스트로 만들 수 있다.
변수 := 표현식
과 같이 사용해 가독성을 올리고 코드를 짧게 해주는 장점이 있다네..
dictionary에서 값을 가져올 때 인덱싱도 되지만 get을 사용하는 방법도 있다.
만약 가져오려하는 값의 key가 dictionary에 없다면 error가 나기 때문에 get을 이용하면 한 줄로 간단하게 처리할 수 있다.
dict.get(x, -1)
만약 dict.get(x)
로 지정하고 dict에 x가 없다면 이는 None(NoneType)을 반환한다.
def solution(id_pw, db):
if db_pw := dict(db).get(id_pw[0]):
return 'login' if db_pw==id_pw[1] else 'wrong pw'
return 'fail'
이 문제에서 배운게 많다!
1) 이차원 리스트를 dict()함수를 사용해 dictionary로 변환할 수 있다.
2) get을 사용해 예외를 처리할 수 있다.
3) :=를 이용해 할당과 반환을 동시에 할 수 있다.
그냥 특정 값으로 냅다 계속 나눠버리면 된다.
그러고 최종 몫이 1인지 확인
while b%2==0:
b = b//2
while b%5==0:
b = b//5
return 1 if b==1 else 2
이 코드는 b의 소인수가 2나 5로만 이루어져있는지 확인하는 코드이다.
해당 문제에서 사용된다.
a, b = list[:2]
이렇게 하면 list[:2]의 두 원소가 각각 a,b로 할당된다.
list[::2], list[1::2] -> 이와 같이 홀수번째 수, 짝수번째 수 만을 뽑아낼 수 있다.
(n*(2n+(n-1)d))//2
d는 공차, n은 마지막 항