반응형
숫자가 들어 있는 문자열을 올바르게 정렬하는 방법은 무엇입니까?
숫자가 포함된 문자열 목록이 있는데 정렬할 수 있는 좋은 방법을 찾을 수 없습니다.
예를 들어 다음과 같은 정보를 얻을 수 있습니다.
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
반응형
'programing' 카테고리의 다른 글
matplotlib: 색상 막대 및 텍스트 레이블 (0) | 2023.07.20 |
---|---|
가져오기 오류: psycopg2라는 모듈이 없습니다. (0) | 2023.07.20 |
IPython 노트북을 올바르게 닫는 방법은 무엇입니까? (0) | 2023.07.20 |
PL/SQL에서 쉼표로 구분된 문자열을 구문 분석하는 방법은 무엇입니까? (0) | 2023.07.20 |
Oracle의 NULL 스토리지 (0) | 2023.07.20 |