Python 코딩 문제 풀이에 자주 사용하는 나만의 팁
코딩 문제 풀이 시 제가 자주 사용하는 기법을 정리해 보았습니다.
코딩 문제 풀이와 실질적인 프로그래밍은 약간 차이가 있습니다. 그래서 잘 쓰이지 않을 때도 있지만, 코딩 문제 풀이 위해서 꼭 알아두면 좋습니다.
Reversed List
List slice를 사용하여 ‘[::-1]’ 을 사용하면 reverse 된다.
L1 = [1, 2, 3, 4, 5]
print(L1[::-1])
# 출력 : [5, 4, 3, 2, 1]
lambda 함수를 이용한 map과 sort
map
의 경우 기존의 리스트를 원하는 형태로 1차 가공할 때 많이 사용 된다.
예를 들어 입력 받은 리스트가 숫자 ‘문자’일 때, 숫자 형으로 일괄적으로 바꾸고 싶을 때 ‘map(int, L1)’식으로 ‘int’ 함수를 변수로 넣어주면 된다. 이 때, `map’은 iterator를 반환하므로 list로 받고 싶으면 전체에 ‘list()’ 해준다.
map
에서 함수 받는 자리에 아래처럼 lambda
를 사용하면 더 파워풀 하게 사용할 수 있다.
L1 = [1, 2, 3, 4, 5]
L3 = list(map(lambda x: x*3, L1))
print(L3)
# 출력 : [3, 6, 9, 12, 15]
이번에는 lambda
를 이용한 정렬이다.
리스트의 정렬에는 ‘sorted()’를 사용하는데, 변수로 ‘key’와 ‘reverse’를 사용할 수 있다.
‘reverse=True’를 줄 경우에 내림차순으로 정렬하게 되며, ‘key’는 쉽게 말해 각 원소의 크고 작음을 판단하는데 기준이 되는 함수라고 생각하면 된다.
아래 리스트 ‘L4’와 같이 ‘tuple’을 원소로 하는 리스트를, 각 tuple의 두번째 값인 문자 순으로 배열하고 싶다면 아래와 같이 사용하면 된다.
L4 = [(1,'A'), (2,'C'), (3, 'AB'), (4, 'Z'), (5, 'D')]
L5 = sorted(L4, key=lambda x: x[1])
print(L5)
#출력 : [(1, 'A'), (3, 'AB'), (2, 'C'), (5, 'D'), (4, 'Z')]
list copy 주의 사항
기존 List를 복사하고 싶을 때, 단순하게 ‘L2 = L1’으로 copy를 만들면 안된다. 이 방법은 리스트가 참조하는 ‘주소’가 같다는 의미가 되어, 아래 예시 처럼 ‘L2.append()’가 원래의 리스트인 L1에도 영향을 주는 것을 볼 수 있다.
L1 = [1, 2, 3]
L2 = L1
L2.append(4)
print(L1)
print(L2)
# 출력 :
# [1, 2, 3, 4]
# [1, 2, 3, 4]
이 점을 주의하고, copy를 하기 위해서는 아래의 방법을 사용하자
- L2 = L1.copy()
- L2 = list(L1)
- L2 = L1[:]
python으로 코테를 보는데 계속 이 shallow copy 문제가 걸려서 개고생했다. 제발 deepcopy하자…
Note!! print(id(x))
로 참조하는 주소값을 확인 할 수 있다.
f- string, format
string을 출력할 때 여러가지 방법이 있다. 그 중 꽤 편한 방법은 "string {}".format(var)
이 방법이라고 생각한다.
문자열 사이사이에 {}를 원하는 개수 만큼 넣고, 나중에 뒤에서 ‘.format()’안에 변수들을 넣어 주면 된다.
형식 지정은 {}안에 ‘:.2f’ 와 같은 형태로 추가하면 된다!
또 다른 방법으로는, 조금 더 읽기 쉬운 형태인 f-string
방법이 있다.
f"string {var}"
형태로, 변수를 넣을 위치에 바로 {}를 사용할 수 있어서 읽기 쉬운 장점이 있다.
형식 지정은 위의 format과 마찬가지로 ‘{var:.2f}’로 넣어주면 된다. (아래 예시 참고)
var = 3.123456
print(f"var = {var:.2f}")
# 출력 : var = 3.12