[문자열 조작] 로그 파일 재정렬
람다와 +
연산자를 이용
from typing import List
def reorder_log_files(logs: List[str]) -> List[str]:
letters, digits = [], []
for log in logs: # separate digis and letters
if log.split()[1].isdigit(): # Is the second element digit or not?
digits.append(log)
else:
letters.append(log)
# sort two keys using lambda expression
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
return letters + digits
if __name__ == "__main__":
logs = [
"dig1 8 1 5 1",
"let1 art can",
"dig2 3 6",
"let2 own kit dig",
"let3 art zero",
]
print(reorder_log_files(logs))
- 먼저 리스트의 원소들인 문자열들을
split()
한 후 1번 인덱스의 원소가 숫자인지 아닌지 판단하여 각 리스트에append
해준다. - 숫자 로그는 입력 순서대로 하므로 문자 로그만 정렬해주면 되는데
sort()
와lambda
를 사용해준다.
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
-
sort()
함수의key
로lambda
함수를 사용하였다.- 식별자를 제외한 문자열
[1:]
를 키로 하여 정렬을 하고, 동일한 경우 후 순위로 식별자[0]
를 지정해 정렬해준다.
- 식별자를 제외한 문자열
-
마지막으로 모두 이어붙여서 리턴해준다.
람다 표현식
s = ["2 A", "1 B", "4 C", "1 A"]
s.sort(key=lambda x: (x.split()[1], x.split()[0]))
print(s)
- 위와 같이 두 개의 key를 람다 표현식으로 표현해 정렬할 수 있다.
- 먼저 문자를 기준으로 정렬한 후 같으면 숫자를 기준으로 정렬하게 된다.
위 람다 표현식은 다음과 동일하다.
def func(x):
return x.split()[1], x.split()[0]
s.sort(key=func)
print(s
- 위와 같은 결과가 나오게 된다.
참고 자료
- 파이썬 알고리즘 인터뷰
Author And Source
이 문제에 관하여([문자열 조작] 로그 파일 재정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@t1won/문자열-조작-로그-파일-재정렬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)