programing

문자열 목록을 숫자로 정렬하는 방법은 무엇입니까?

powerit 2023. 7. 17. 21:29
반응형

문자열 목록을 숫자로 정렬하는 방법은 무엇입니까?

나는 이것이 사소한 것처럼 들린다는 것을 알지만 나는 깨닫지 못했습니다.sort()파이썬의 기능이 이상했습니다.저는 실제로 문자열 형태의 "숫자" 목록을 가지고 있기 때문에 먼저 그것들을 int로 변환한 다음 정렬을 시도합니다.

list1=["1","10","3","22","23","4","2","200"]
for item in list1:
    item=int(item)

list1.sort()
print list1

제공:

['1', '10', '2', '200', '22', '23', '3', '4']

내가 원하는 것은

['1','2','3','4','10','22','23','200']

숫자 집합 정렬과 관련된 알고리즘을 찾아봤지만, 제가 찾은 알고리즘은 모두 영숫자 집합 정렬과 관련이 있습니다.

나는 이것이 아마도 머리가 나쁜 문제가 아니라는 것을 알지만 구글과 내 교과서는 그것보다 더 유용하거나 덜 유용한 것을 제공하지 않습니다..sort()기능.

문자열을 실제로 int로 변환하지 않았습니다.아니면, 당신은 그랬지만, 결과에 대해 아무것도 하지 않았습니다.원하는 것은 다음과 같습니다.

list1 = ["1","10","3","22","23","4","2","200"]
list1 = [int(x) for x in list1]
list1.sort()

어떤 이유로 인해 int 대신 문자열을 유지해야 하는 경우(일반적으로 좋지 않은 아이디어이지만 선행 0이나 다른 것을 유지해야 할 수도 있음) 키 함수를 사용할 수 있습니다. sort된 매개 변수인 명명된매사용니다합수를 합니다.key비교하기 전에 각 요소에 대해 호출되는 함수입니다.목록 요소를 직접 비교하는 대신 키 함수의 반환 값을 비교합니다.

list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)
# or if you want to do it all in the same line
list1 = sorted([int(x) for x in list1]) 

저는 어제 같은 문제에 접근하여 natsort라는 모듈을 찾았는데, 이것이 당신의 문제를 해결해줍니다.사용:

from natsort import natsorted # pip install natsort

# Example list of strings
a = ['1', '10', '2', '3', '11']

[In]  sorted(a)
[Out] ['1', '10', '11', '2', '3']

[In]  natsorted(a)
[Out] ['1', '2', '3', '10', '11']

# Your array may contain strings
[In]  natsorted(['string11', 'string3', 'string1', 'string10', 'string100'])
[Out] ['string1', 'string3', 'string10', 'string11', 'string100']

또한 사전에 대해 다음과 같은 기능을 제공합니다.sorted.

를 당은함전수있다니습달에 할 수 .key메서드에 대한 매개 변수입니다.이렇게 하면 시스템이 x 대신 키(x)로 정렬됩니다.

list1.sort(key=int)

BTW, 목록을 영구적으로 정수로 변환하려면 다음 함수를 사용합니다.

list1 = list(map(int, list1))   # you don't need to call list() in Python 2.x

또는 이해력을 나열

list1 = [int(x) for x in list1]

기능을 사용하고자 하는 경우:sorted(list1, key=int)

새 정렬 목록을 반환합니다.

다음을 사용할 수도 있습니다.

import re

def sort_human(l):
    convert = lambda text: float(text) if text.isdigit() else text
    alphanum = lambda key: [convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key)]
    l.sort(key=alphanum)
    return l

수 다른 이것은당신인찾을수있다것매른다는들대작니우합동해도서에영들숫자같또은비한과슷만지하이서터에넷an▁like▁this▁for다icals▁alph작니합▁works▁also동▁stuff▁that대▁isumer▁the도서해▁other▁on▁very▁but이▁can▁to▁you▁find와 같은 영숫자에도 효과가 있습니다.[abc0.1, abc0.2, ...].

파이썬의 종류는 이상하지 않습니다.단지 이 코드는 다음과 같습니다.

for item in list1:
   item=int(item)

당신이 생각하는 것을 하고 있지 않습니다.item목록에 다시 추가되지 않고 그냥 버려집니다.

어쨌든, 올바른 해결책은 사용하는 것입니다.key=int다른 사람들이 보여준 것처럼.

Seamus Campbell의 답변은 Python 2.x에서 작동하지 않습니다.

list1 = sorted(list1, key=lambda e: int(e))용사를 lambda기능이 잘 작동합니다.

이렇게 하면 목록이 내림차순으로 정렬됩니다(이 경우 키를 지정할 필요가 없음).

과정

listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9]
listC = sorted(listB, reverse=True) # listB remains untouched
print listC

출력:

 [48, 46, 25, 24, 22, 13, 8, -9, -15, -36]

가장 최근의 해결책이 맞습니다.솔루션을 문자열로 읽고 있습니다. 이 경우 순서는 1, 100, 104, 2, 21, 2001001010, 3 등입니다.

대신 입력을 int로 캐스트해야 합니다.

정렬된 문자열:

stringList = (1, 10, 2, 21, 3)

정렬된 int:

intList = (1, 2, 3, 10, 21)

캐스팅하려면 문자열 List를 int(blahblah) 안에 넣기만 하면 됩니다.

다시:

stringList = (1, 10, 2, 21, 3)

newList = int (stringList)

print newList

=> returns (1, 2, 3, 10, 21) 

진짜 문제는 영숫자로 정렬하는 것입니다.따라서 목록 ['1', '2', '10', '19']이 있고 정렬을 실행하면 ['1', '10', '19', '2'가 됩니다.ie 10은 첫 번째 문자를 보고 그것부터 정렬하기 때문에 2 앞에 옵니다.파이썬의 대부분의 메소드는 그 순서대로 물건을 반환하는 것 같습니다.예를 들어 1.jpg, 2.jpg 등으로 표시된 파일이 있는 abc라는 이름의 디렉토리에서 file_list=os.listdir(filename)를 지정하면 file_list가 예상대로 정렬되지 않고 file_list=['1.jpg', '11.jpg', '15.jpg', '2.jpg]로 정렬됩니다.파일이 처리되는 순서가 중요한 경우(아마도 숫자로 이름을 지정했기 때문일 것입니다), 순서는 생각하는 순서와 다릅니다."제로" 패딩을 사용하여 이 문제를 방지할 수 있습니다.예를 들어 목록 =['01', '03', '05', '10', '02', '04', '06]이 있고 정렬을 실행하면 원하는 순서를 얻을 수 있습니다.list=['01', '02' 등]은(는) 첫 번째 문자가 1보다 앞에 오는 0이기 때문입니다.필요한 0 패딩의 양은 목록에서 가장 큰 값으로 결정됩니다.예를 들어, 가장 큰 숫자가 100에서 1000 사이인 경우 한 자릿수를 001, 002 ---010,011--100, 101 등으로 입력해야 합니다.

번호 문자열을 사용하려면 내 코드에 표시된 것처럼 다른 목록을 사용하는 것이 좋습니다.

list1=["1","10","3","22","23","4","2","200"]

k=[]    
for item in list1:    
    k.append(int(item))

k.sort()
print(k)
# [1, 2, 3, 4, 10, 22, 23, 200]

간단한 숫자 목록 정렬 방법

numlists = ["5","50","7","51","87","97","53"]
results = list(map(int, numlists))
results.sort(reverse=False)
print(results)

최고의 파이썬은 아닐 수도 있지만, 예상 대상이 있는 ['1', '1.0', '2.0', '2.0', '1.10', '1.11', '1.2', '1.1', '1.1', '2.11', '2.0', '5'와 같은 문자열 목록의 경우 도움이 되었습니다.

unsortedList = ['1','1.0','2.0','2', '1.1', '1.10', '1.11', '1.2','7','3','5']
sortedList = []
sortDict = {}
sortVal = []
#set zero correct (integer): examp: 1.000 will be 1 and breaks the order
zero = "000"
for i in sorted(unsortedList):
  x = i.split(".")
  if x[0] in sortDict:
    if len(x) > 1:
        sortVal.append(x[1])
    else:
        sortVal.append(zero)
    sortDict[x[0]] = sorted(sortVal, key = int)
  else:
    sortVal = []
    if len(x) > 1:
        sortVal.append(x[1])
    else:
        sortVal.append(zero)
    sortDict[x[0]] = sortVal
for key in sortDict:
  for val in sortDict[key]:
    if val == zero:
       sortedList.append(str(key))
    else:
       sortedList.append(str(key) + "." + str(val))
print(sortedList)
scores = ['91','89','87','86','85']
scores.sort()
print (scores)

이것은 버전 2에는 없었지만 파이썬 버전 3을 사용하는 데 효과가 있었습니다.

언급URL : https://stackoverflow.com/questions/3426108/how-to-sort-a-list-of-strings-numerically

반응형