[파이썬] 로그 파일 재정렬 (feat. 람다 표현식)
문제
로그를 재정렬하라. 기준은 다음과 같다.
1. 로그의 가장 앞 부분은 식별자다.
2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.
4. 숫자 로그는 입력 순서대로 한다.
입출력 예시
입력
logs = ["dig1 8 1 5 1", "let1 art can", "dig2 3 6", "let2 own kit dig", "let3 art zero"]
출력
>> ['let1 art can', 'let3 art zero', 'let2 own kit dig', 'dig1 8 1 5 1', 'dig2 3 6']
풀이
문자로 구성된 로그가 숫자로 구성된 로그보다 앞에 온다.
숫자로 구성된 로그는 입력 순서대로 둬야한다.
이 두가지 조건을 보면, 문자와 숫자를 구분해야함을 알 수 있다.
따라서 숫자 로그를 넣을 리스트와, 문자 로그를 넣을 리스트를 각각 만든다.
digit = []
letters = []
이제 입력으로 주어진 리스트를 돌며, 숫자 로그는 digit 리스트에, 문자 로그는 letters 리스트에 넣어줘야한다.
숫자로그인지 문자로그인지는 어떻게 아는가?
logs를 살펴보면 원소 하나가 "dig1 8 1 5 1"이런식으로 공백으로 구분된 문자열로 구성되어 있다.
따라서 문자열을 공백 기준으로 split()하면 ["dig1", "8", "1", "5", "1"]이 될텐데 split()한 것의 index1을 보면 문자로그인지 숫자로그인지 알 수 있다.
이것을 코드로 나타내면 다음과 같다.
for log in logs:
if log.split()[1].isdigit():
digit.append(log)
else:
letter.append(log)
문자로그끼리는 정렬을 해줘야 하는데, 이 때 파이썬의 람다 표현식을 활용한다.
split()[0]은 식별자이므로, 식별자를 제외한 뒤의 문자들을 기준으로 정렬하되,
문자열이 같은 경우 식별자를 기준으로 정렬하는 것을 람다 표현식으로 나타내면 다음과 같다.
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
덧붙이자면
sort에는 람다표현식을 key로 넣을 수 있는데, key를 기준으로 정렬하겠다는 의미다.
key의 요소가 여러개인 경우 튜플로 사용할 수 있다.
마지막으로 문자로그가 숫자로그보다 앞에 온다는 조건을 만족시키기 위해 다음과 같은 코드를 작성한다.
return letters + digit
전체 코드
def solution(logs: list[str]):
digit = []
letters = []
for log in logs:
if log.split()[1].isdigit():
digit.append(log)
else:
letters.append(log)
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
return letters + digit
# test case
logs = ["dig1 8 1 5 1", "let1 art can", "dig2 3 6", "let2 own kit dig", "let3 art zero"]
print(solution(logs))