2013-07-12 4 views
2

나는 다음과 같은 목록이 있습니다입니다이 목록을 정렬하는 가장 좋은 방법은 무엇입니까?

my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 

을 내가 목록을 정렬하고 내가 지금까지 시도 이것이

name.1 
name.2 
name.4 
name.13 
name.32 

같은 순서로 그것을 밖으로 인쇄 싶습니다

print sorted(my_list) 

name.1 
name.13 
name.2 
name.32 
name.4 

sorted() 명령은 문자열을 알파벳순으로 처리합니다. 어쩌면 .을 먼저 찾은 후에 숫자를 정렬하는 것이 더 좋을까요?

올바르게 정렬하는 좋은 방법이 있습니까? 가장 효율적인 접근 방법은 무엇입니까? 어떻게 적용 할 것인가? 나는 튜플리스트를 가지고 있고 튜플의 두번째 요소를 사용하여 그것을 정렬하고 싶었던가? 예를 들어 : 당신은 질문이 개선 될 수 있다고 생각한다면 항상

tuple_list = [('i','name.2'),('t','name.13'),('s','name.32'),('l','name.1'),('s','name.4')] 

print tuple_list 
'l','name.1' 
'i','name.2' 
's','name.4' 
't','name.13' 
's','name.32' 

도와 주셔서 감사하고, 의견을/명확히.

알렉스

+1

기간 이전의 텍스트는 항상 동일합니까 (예 : '이름')? 그렇지 않다면 어떻게 이름이 다른 항목을 정렬하고 싶습니까? –

+0

텍스트는 항상 '이름'입니다. 뒤에 숫자 – user1083734

+0

가능한 [파이썬에서 알파 숫자를 정렬하는 방법] 복제 (http://stackoverflow.com/questions/2669059/how-to-sort-alpha-numeric-set-in-python) – tamasgal

답변

8

당신은 this 대답 유사 그것을 시도 할 수 :

예는 람다를 전달 :이 무엇을 설명하는

>>> tuple_list = [('i','name.2'),('t','name.13'),('s','name.32'),('l','name.1'),('s','name.4')] 
>>> sorted(tuple_list, key=lambda (a,b): (int(b.split('.')[1]))) 
[('l', 'name.1'), ('i', 'name.2'), ('s', 'name.4'), ('t', 'name.13'), ('s', 'name.32')] 

편집 :

>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
>>> sorted(my_list, key=lambda a: (int(a.split('.')[1]))) 
['name.1', 'name.2', 'name.4', 'name.13', 'name.32'] 

또는 튜플 함수를 sorted으로 변환하여 문자열을 분할 한 다음 두 번째 부분 인 t 정수. sorted은이 정수를 사용하여 목록 항목을 정렬합니다.

이 예제는 정렬 할 때 도트의 왼쪽에있는 문자열을 완전히 무시합니다. 첫 번째 부분을 기준으로 정렬해야하는지 알려주세요.

+0

이것은 멋진 해결책입니다! 감사합니다 - 질문 편집에 게시 된 튜플 상황 목록에 어떻게 대처할 수 있습니까? – user1083734

+0

답변을 업데이트했습니다. – jeyk

+0

위대한 일을했습니다. 고마워요! : D – user1083734

3

이 시도 :

sorted(my_list, key=lambda x: int(x.split('.')[1])) 

데모 : 튜플로 확장

>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
>>> sorted(my_list, key=lambda x: int(x.split('.')[1])) 
['name.1', 'name.2', 'name.4', 'name.13', 'name.32'] 
>>> 

,

sorted(tuple_list, key = lambda x: int(x[1].split('.')[1])) 

DEMO :

>>> sorted(tuple_list, key = lambda x: int(x[1].split('.')[1])) 
[('l', 'name.1'), ('i', 'name.2'), ('s', 'name.4'), ('t', 'name.13'), ('s', 'name.32')] 
+0

왜 안돼 적절한 정렬? – inspectorG4dget

+0

무엇이 잘못 되었나요? – karthikr

+2

@karthikr 질문 당 숫자로 정렬되지 않습니다. –

3

이 하나 더 많은 메모리를 사용하지만 각 항목을 여러 번 분할하지 않습니다

from operator import itemgetter 
my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
my_nlist= [ (int(n.split('.')[1]), i) for i,n in enumerate(my_list)] 
my_list = [ my_list[t[1]] for t in sorted(my_nlist, key=itemgetter(0))] 

이 튜플을 다루는 :

my_list = [('i','name.2'),('t','name.13'), 
      ('s','name.32'),('l','name.1'),('s','name.4')] 
my_nlist= [ (int(n[1].split('.')[1]), i) for i,n in enumerate(my_list)] 
my_list = [ my_list[t[1]] for t in sorted(my_nlist, key=itemgetter(0))] 
+0

재미있는 접근 방법은 질문 편집에서 튜플 상황 목록에 어떻게 대처할 수 있을까요? – user1083734

3

업데이트] 답변

으로 natsort 버전 4.0을 .외부 패키지에 반대하지 않는 경우, 시도 < 4.0.0

natsort에 대한

>>> import natsort 
>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
>>> natsort.natsorted(my_list) 
['name.1','name.2', 'name.4','name.13', 'name.32'] 

OLD 답변 : 0,이 모든 옵션을 지정할 필요없이 상자 밖으로 작동 natsort 패키지 (버전> = 3.0.0)

>>> import natsort 
>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
>>> natsort.natsorted(my_list, number_type=int) 
['name.1','name.2', 'name.4','name.13', 'name.32'] 

number_type 인수이 필요하다 예를 들어, natsort은 기본적으로 float를 찾고 소수점은이 모든 숫자를 float으로 해석하기 때문입니다.


전체 공개 : 나는 natsort 저자.

+0

나는 반대하지 않는다, 이것은 매우 유용하다! 그래서 튜플 상황의 목록에 대처하기 위해, 나는'natsort.natsorted (my_list [1])'을 할 것인가? – user1083734

+0

이것은 멋지다. 나는이 패키지를 모른다. – jeyk

+0

나는 그것을 좋아해서 기뻐요! 예, 튜플 목록에 대해 작동해야합니다. – SethMMorton