파이썬에서 알파벳 숫자 세트를 정렬하는 방법
나는 세트가있다
set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
정렬 후 다음과 같이 보이기를 원합니다.
4 sheets,
12 sheets,
48 sheets,
booklet
어떤 아이디어라도주세요
짧고 달다:
sorted(data, key=lambda item: (int(item.partition(' ')[0])
if item[0].isdigit() else float('inf'), item))
이 버전 :
- Python 2 및 Python 3에서 작동하는 이유는 다음과 같습니다.
- 문자열과 정수를 비교한다고 가정하지 않습니다 (Python 3에서는 작동하지 않음).
- (Python 3에 존재하지 않는)
cmp매개 변수를 사용sorted하지 않습니다.
- 수량이 같으면 문자열 부분에서 정렬합니다.
예제에 설명 된대로 정확하게 인쇄 된 출력을 원하면 다음을 수행하십시오.
data = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
r = sorted(data, key=lambda item: (int(item.partition(' ')[0])
if item[0].isdigit() else float('inf'), item))
print ',\n'.join(r)
Jeff Atwood 가 자연 정렬에 대해 이야기하고 Python에서이를 수행하는 한 가지 방법의 예를 제공합니다. 여기에 내 변형이 있습니다.
import re
def sorted_nicely( l ):
""" Sort the given iterable in the way that humans expect."""
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(l, key = alphanum_key)
다음과 같이 사용하십시오.
s = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
for x in sorted_nicely(s):
print(x)
산출:
4 sheets
12 sheets
48 sheets
booklet
이 방법의 한 가지 장점은 문자열이 공백으로 구분 될 때만 작동하지 않는다는 것입니다. 버전 번호의 마침표와 같은 다른 구분 기호에서도 작동합니다 (예 : 1.9.1은 1.10.0 이전에 표시됨).
타사 라이브러리 natsort를 확인해야합니다 . 알고리즘은 일반적이므로 대부분의 입력에 대해 작동합니다.
>>> import natsort
>>> your_list = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
>>> print ',\n'.join(natsort.natsorted(your_list))
4 sheets,
12 sheets,
48 sheets,
booklet
간단한 방법은 문자열을 숫자 부분과 숫자가 아닌 부분으로 나누고 파이썬 튜플 정렬 순서를 사용하여 문자열을 정렬하는 것입니다.
import re
tokenize = re.compile(r'(\d+)|(\D+)').findall
def natural_sortkey(string):
return tuple(int(num) if num else alpha for num, alpha in tokenize(string))
sorted(my_set, key=natural_sortkey)
이 경우에도 잘 작동하기 때문에이 답변 을 여기에 다시 게시하는 것이 좋습니다.
from itertools import groupby
def keyfunc(s):
return [int(''.join(g)) if k else ''.join(g) for k, g in groupby(s, str.isdigit)]
sorted(my_list, key=keyfunc)
데모:
>>> my_set = {'booklet', '4 sheets', '48 sheets', '12 sheets'}
>>> sorted(my_set, key=keyfunc)
['4 sheets', '12 sheets', '48 sheets', 'booklet']
Python3의 경우 약간 수정해야합니다 (이 버전은 Python2에서도 정상적으로 작동합니다).
def keyfunc(s):
return [int(''.join(g)) if k else ''.join(g) for k, g in groupby('\0'+s, str.isdigit)]
>>> a = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
>>> def ke(s):
i, sp, _ = s.partition(' ')
if i.isnumeric():
return int(i)
return float('inf')
>>> sorted(a, key=ke)
['4 sheets', '12 sheets', '48 sheets', 'booklet']
SilentGhost의 답변을 바탕으로 :
In [4]: a = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
In [5]: def f(x):
...: num = x.split(None, 1)[0]
...: if num.isdigit():
...: return int(num)
...: return x
...:
In [6]: sorted(a, key=f)
Out[6]: ['4 sheets', '12 sheets', '48 sheets', 'booklet']
문자열 배열의 모든 위치에있는 숫자를 정렬하는 일반적인 대답입니다. Python 2 및 3에서 작동합니다.
def alphaNumOrder(string):
""" Returns all numbers on 5 digits to let sort the string with numeric order.
Ex: alphaNumOrder("a6b12.125") ==> "a00006b00012.00125"
"""
return ''.join([format(int(x), '05d') if x.isdigit()
else x for x in re.split(r'(\d+)', string)])
Sample:
s = ['a10b20','a10b1','a3','b1b1','a06b03','a6b2','a6b2c10','a6b2c5']
s.sort(key=alphaNumOrder)
s ===> ['a3', 'a6b2', 'a6b2c5', 'a6b2c10', 'a06b03', 'a10b1', 'a10b20', 'b1b1']
Part of the answer is from there
sets are inherently un-ordered. You'll need to create a list with the same content and sort that.
For people stuck with a pre-2.4 version of Python, without the wonderful sorted() function, a quick way to sort sets is:
l = list(yourSet)
l.sort()
This does not answer the specific question above (12 sheets will come before 4 sheets), but it might be useful to people coming from Google.
참고URL : https://stackoverflow.com/questions/2669059/how-to-sort-alpha-numeric-set-in-python
'Program Club' 카테고리의 다른 글
| 파이프를 통해 죽이기 위해 인수를주는 방법 (0) | 2020.12.02 |
|---|---|
| 잘못된 인덱스로 인해 카운터 이름 데이터를로드 할 수 없습니다. 예외 (0) | 2020.12.02 |
| 소문자가 포함 된 값이있는 행을 찾는 방법 (0) | 2020.12.02 |
| 문자열을 특정 날짜 형식으로 변환 하시겠습니까? (0) | 2020.12.02 |
| “minifyEnabled”대“shrinkResources”-차이점은 무엇입니까? (0) | 2020.12.01 |