문제 링크

https://leetcode.com/problems/reorder-data-in-log-files/

나의 풀이

소스 코드
from typing import List


class Solution:
    def my_solution(self, logs: List[str]) -> List[str]:
        let, dig = [], []
        for log in logs:
            if log[-1].isnumeric():
                dig.append(log)
            else:
                splitted = log.split()
                words = (splitted[0], ' '.join(splitted[1:]))
                let.append(words)
                let.sort(key=lambda x: (x[1], x[0]))

        result = list(map(lambda x: ' '.join(x), let))
        return result + dig

문제 풀이

람다와 + 연산자를 사용하는 방법

소스 코드
from typing import List


class Solution:
    def solution1(self, logs: List[str]) -> List[str]:
        letters, digits = [], []
        for log in logs:
            # 1. 문자와 숫자 구분
            if log.split()[1].isdigit():
                digits.append(log)
            else:
                letters.append(log)

        # 2. 2개의 키를 람다 표현식으로 정렬
        # 튜플의 첫 번째 요소를 기준으로 정렬 수행,
        # 값이 같을 경우 두 번째 요소를 기준으로 정렬 수행
        letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))

        # 3. '+' 연산자로 두 개의 리스트를 병합
        return letters + digits

배운 점

문자열이 숫자로 이루어져 있는지 판별하는 함수

  • isdecimal(): 0 ~ 9로만 이루어진, int로 변환 가능한 숫자 문자인지 판단하는 함수
  • isdigit(): 0 ~ 9 뿐만 아니라, ²같이 숫자처럼 생긴 글자의 여부를 판단하는 함수
  • isnumeric(): isdigit()보다 넓은 의미로, ½과 같이 숫자값 표현에 해당하는 텍스트인지 판단하는 함수
  • 즉, isdecimal() -> isdigit() -> isnumeric() 순으로 범위가 넓어진다고 보면 된다.

기타

  • 람다 표현식에 들어가는 튜플은 첫 번째 요소부터 비교, 해당 요소가 같으면 다음 요소를 비교하는 방식으로 동작한다.
  • 리스트 간에도 + 연산자를 사용하여 두 리스트를 병합할 수 있다.

출처