[문자열 조작] 로그 파일 재정렬

Reorder Log Files

람다와 + 연산자를 이용

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() 함수의 keylambda 함수를 사용하였다.

    • 식별자를 제외한 문자열 [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
  • 위와 같은 결과가 나오게 된다.

참고 자료

  • 파이썬 알고리즘 인터뷰

좋은 웹페이지 즐겨찾기