문자열 슬라이싱
- 문자열 슬라이싱은 편리한 기능 제공과 동시에 내부에서 매우 빠르게 수행된다.
- 위치를 지정하면 해당 위치의 배열 포인터를 얻게 되며 이를 통해 연결된 객체를 찾아 실제 값을 찾아낸다.
- 문자열을 별도로 리스트로 매핑하는 등의 처리는 데이터 구조에는 좋은 방법이지만, 별도 자료형으로 매핑하는 과정에서 상당한 연산 비용이 필요하므로 전체적인 속도에서 손해를 보게 된다.
알고리즘 | 실행 시간 | 슬라이싱을 1로 했을 때의 비율 |
슬라이싱 | 0.499μs | 1 |
리스트 reverse() | 2.46μs | 5 |
reversed() + join() | 2.49μs | 6 |
for 반복 | 5.5μs | 12 |
while 반복 | 9.4μs | 21 |
재귀 | 24.3μs | 24 |
슬라이싱을 기준으로 한 파이썬 문자열 처리 실행시간(μs는 마이크로 초를 의미)
슬라이싱 활용 방법
예시) 감사합니다 라는 문자열을 통해 확인
0 1 2 3 4
감 사 합 니 다
-5 -4 -3 2 -1
S[1:4] == 사합니 : 인덱스 1에서 4 이전까지 표현, 실질적으로 1에서 3까지만 해당한다
S[1:-2] == 사합 : 인덱스 1에서 -2 이전(-2 포함 x)까지 표현한다.
S[1:] == 사합니다 : 문자열의 시작 또는 끝은 생략이 가능하다
S[:] == 감사합니다 : 둘 다 생략하면 사본을 리턴한다. 파이썬은 a = b와 같은 형태로 할당하면 변수의 값이 할당되는 것이 아니라 a 변수가 b 변수를 참조하는 형태가 된다. 참조가 아닌 값을 복사하기 위해 [:]를 사용할 수 있으며, 이 방식은 문자열이나 리스트를 복사하는 파이썬다운 방식이기도 하다.
S[1:100] == 사합니다 : 인덱스가 범위보다 초과 할 경우, 문자열의 최대 길이만큼 표현된다.
S[-1] == 다 : 마지막 문자(뒤에서 첫 번째)
S[-4] == 사 : 뒤에서 4번째
S[:-3] == 감사 : 뒤에서 3개 글자 앞까지
S[-3:] == 합니다 : 뒤에서 3번째 문자에서 마지막까지
S[::1] == 감사합니다 : 1은 기본값으로 동일하다
S[::-1] == 다니합사감 : 뒤집는다(reverse)
S[::2] == 감합다 : 2칸씩 앞으로 이동한다
람다 표현식
- 식별자 없이 실행 가능한 함수를 말하며, 함수 선언 없이도 하나의 식으로 함수를 단순하게 표현할 수 있다.
예시로 s.sort(key = lambda x: (x.split()[1], x.split()[0]))
만약 s가 ['2 A', '1 B', '4 C', '1 A']라면 sorted()로 정렬한 결과는 다음과 같다.
sorted(s) => ['1 A', '1 B', '2 A', '4 C']
그러나 이런 방식이 아닌 그 뒤의 문자 순 정렬을 원할떄 , 문자가 동일한 경우에는 그 앞 번호순으로 정렬되는 형태를 희망한다. 이떄 리스트의 각 요소를 풀어서 별도 처리를 해줘야 하는데, 이럴 떄 람다 표현식이 사용 가능하다. 만약 람다를 사용하지 않고 함수를 사용하면 다음과 같이 된다.
def func(x):
return x.split()[1], x.split()[0]
...
...
s.sort(key = func)
s
# ['1 A', '2 A', '1 B', '4 C']
하지만 람다 표현식을 사용하면, 다음과 같이 별도 함수를 선언하지 않고도 간단한 함수를 선언한 것 처럼 쉽게 처리할 수 있다.
s.sort(key = lambda x: (x.split()[1], x.split()[0]))
s
# ['1 A', '2 A', '1 B', '4 C']
'알고리즘 공부 > 파이썬 알고리즘 인터뷰' 카테고리의 다른 글
파이썬 알고리즘 인터뷰 - 연결 리스트 및 연결 리스트 활용 (0) | 2022.02.02 |
---|---|
파이썬 알고리즘 인터뷰 - 배열, 투 포인터 기법, 최댓값과 최솟값 (0) | 2022.01.30 |
파이썬 알고리즘 인터뷰 - 리스트, 딕셔너리 (1) | 2022.01.22 |
파이썬 알고리즘 인터뷰 - 자료형 (0) | 2022.01.22 |
파이썬 알고리즘 인터뷰를 통한 팁 (0) | 2022.01.20 |