Program Club

파이썬에서 알파벳 숫자 세트를 정렬하는 방법

proclub 2020. 12. 2. 22:07
반응형

파이썬에서 알파벳 숫자 세트를 정렬하는 방법


나는 세트가있다

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

반응형