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


128

나는 이것이 사소한 것처럼 들리지만 sort()파이썬 의 기능이 이상 하다는 것을 깨닫지 못했습니다 . 실제로 문자열 형식 인 "숫자"목록이 있으므로 먼저 정수로 변환 한 다음 정렬을 시도합니다.

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']

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

나는 이것이 아마도 생각할 수없는 문제라는 것을 알고 있지만 Google과 내 교과서는 .sort()기능 보다 더 유용하거나 덜 유용한 것을 제공하지 않습니다 .


9
for 루프는 내가 생각하는대로 수행하지 않습니다.
deinst

1
업데이트 한 적이 없습니다 list1. 무엇이 list업데이트되고 있다고 생각하게 되었습니까?
S.Lott

list1 = [ '1', '1.10', '1.11', '1.1', '1.2']를 입력하면 비슷한 문제가 발생합니다. [ '1', '1.1', '1.2', '1.10', '1.11']로 출력되는 대신 [ '1', '1.1', '1.10', '1.11', '1.2'가 표시됩니다. ]
sathish

2
파이썬 3에서 당신은 사용할 수 있습니다sorted(mylist)
아킨 환에게

답변:


191

실제로 문자열을 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)

8
나는 2.7에 키 = INT하려고 할 때 아무도 얻을
KI4JGT

1
목록 요소가 "정수"로 저장되면 작동합니다. float 값의 경우 어떻게 처리됩니까? 예 : list1 = [1, 1.10, 1.11, 1.1, 1.2]
sathish

1
@ KI4JGT 정렬 방법은 목록을 수정하고 None을 반환합니다. 따라서 대신 list1 = list1.sort(key=int)그냥 사용하면 list1.sort(key=int)list1이 이미 정렬됩니다.
요시야 Yoder 보낸

1
@ KI4JGT .sort ()는 in place 연산자입니다. None을 반환하고 목록을 정렬합니다. sorted ()를 사용하는 것이 좋습니다.
sherpya

39

당신은에 함수를 전달할 수 key에 매개 변수 방법 . 이를 통해 시스템은 x 대신 key (x)로 정렬됩니다..sort

list1.sort(key=int)

BTW, 목록을 정수로 영구적으로 변환 하려면 함수를 사용 하십시오.map

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

또는 목록 이해

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

21

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

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


1
세트로도 작동합니다!
MT

12

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

for item in list1:
   item=int(item)

당신이 생각하는대로 item하지 않습니다. 목록으로 다시 대체되지 않고 단순히 버려집니다.

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


12

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

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

이것은 인터넷에서 찾을 수있는 다른 것들과 매우 유사하지만 [abc0.1, abc0.2, ...].


9

어제 같은 문제에 접근하여 문제를 해결하는 [natsort] [1]이라는 모듈을 찾았습니다. 사용하다:

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. [1] : https://pypi.org/project/natsort/


8

Seamus Campbell 의 답변은 python2.x에서 작동하지 않습니다. 기능을
list1 = sorted(list1, key=lambda e: int(e))사용 lambda하면 잘 작동합니다.


3

이것을 시도하면 목록이 내림차순으로 정렬됩니다 (이 경우 키를 지정할 필요가 없습니다).

방법

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]

0

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

대신 입력을 int로 CAST해야합니다.

정렬 된 문자열 :

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

정렬 된 정수 :

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

캐스트하려면 stringList를 int (blahblah) 안에 넣으십시오.

다시:

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

newList = int (stringList)

print newList

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

1
TypeError : int () 인수는 'tuple'이 아닌 문자열 또는 숫자 여야합니다.
Cees Timmerman 2014

또한 stringList의 문자열에는 따옴표가 있어야합니다.
Teepeemm

2
즉 만드는 고약한 예측이다 : "가장 최근의 솔루션이 옳다")
GreenAsJade

0

숫자 문자열을 사용하려면 내 코드에 표시된대로 다른 목록을 사용하는 것이 좋습니다.

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]

0

숫자 목록을 정렬하는 간단한 방법

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

-1

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


-5
scores = ['91','89','87','86','85']
scores.sort()
print (scores)

이것은 버전 2에서는 아니었지만 파이썬 버전 3을 사용하여 저에게 효과적이었습니다.


3
거기에서 '11'과 '100'으로 정렬 해보세요.
Penz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.