programing

숫자가 들어 있는 문자열을 올바르게 정렬하는 방법은 무엇입니까?

batch 2023. 7. 20. 21:48
반응형

숫자가 들어 있는 문자열을 올바르게 정렬하는 방법은 무엇입니까?

숫자가 포함된 문자열 목록이 있는데 정렬할 수 있는 좋은 방법을 찾을 수 없습니다.
예를 들어 다음과 같은 정보를 얻을 수 있습니다.

something1
something12
something17
something2
something25
something29

와 함께sort()방법.

어떻게든 숫자를 추출한 다음 목록을 분류해야 한다는 것은 알지만 가장 간단한 방법으로 어떻게 해야 할지 모르겠습니다.

인간 정렬(자연 정렬이라고도 함)을 찾고 있을 수 있습니다.

import re

def atoi(text):
    return int(text) if text.isdigit() else text

def natural_keys(text):
    '''
    alist.sort(key=natural_keys) sorts in human order
    http://nedbatchelder.com/blog/200712/human_sorting.html
    (See Toothy's implementation in the comments)
    '''
    return [ atoi(c) for c in re.split(r'(\d+)', text) ]

alist=[
    "something1",
    "something12",
    "something17",
    "something2",
    "something25",
    "something29"]

alist.sort(key=natural_keys)
print(alist)

수확량

['something1', 'something2', 'something12', 'something17', 'something25', 'something29']

PS. 원래 답변보다 훨씬 빠르므로 Tooty의 자연 정렬 구현(여기 댓글에 게시됨)을 사용하기 위해 답변을 변경했습니다.


부동 소수점을 사용하여 텍스트를 정렬하려면 정규식을 int(즉, regex)와 일치하는 정규식에서 변경해야 합니다.(\d+)) 플로트와 일치하는 정규식으로:

import re

def atof(text):
    try:
        retval = float(text)
    except ValueError:
        retval = text
    return retval

def natural_keys(text):
    '''
    alist.sort(key=natural_keys) sorts in human order
    http://nedbatchelder.com/blog/200712/human_sorting.html
    (See Toothy's implementation in the comments)
    float regex comes from https://stackoverflow.com/a/12643073/190597
    '''
    return [ atof(c) for c in re.split(r'[+-]?([0-9]+(?:[.][0-9]*)?|[.][0-9]+)', text) ]

alist=[
    "something1",
    "something2",
    "something1.0",
    "something1.25",
    "something1.105"]

alist.sort(key=natural_keys)
print(alist)

수확량

['something1', 'something1.0', 'something1.105', 'something1.25', 'something2']

언급URL : https://stackoverflow.com/questions/5967500/how-to-correctly-sort-a-string-with-a-number-inside

반응형