2010-07-12 6 views
3

dict을 포함하는 목록을 정렬하는 데 문제가 있습니다. 현재 내가 다음 줄에 '제목'라는 키를 정렬하고 있습니다 : (목록에 포함 된) dicts를 Python으로 알파벳순으로 정렬

list.sort(key=operator.itemgetter('title')) 
이의 문제는 내 데이터의 일부는 다음과 같이보고 소트이다

:

title_text #49 
title_text #5 
title_text #50 

을 어떻게 것 제목 정렬을 유지하면서 사람이 소비하기에 더 친숙한 방식으로 정렬하는 방법에 대해 알아 보시겠습니까?

+0

언제든지 왼쪽에 숫자 0을 채울 수 있습니까? 예를 들어 title_text # 5가'title_text # 05' - 그럼 당신은 '픽스'할 필요가 없습니다. –

답변

4

당신은 human sorting을 찾고 있습니다.

import re 
# Source: http://nedbatchelder.com/blog/200712/human_sorting.html 
# Author: Ned Batchelder 
def tryint(s): 
    try: 
     return int(s) 
    except: 
     return s 

def alphanum_key(s): 
    """ Turn a string into a list of string and number chunks. 
     "z23a" -> ["z", 23, "a"] 
    """ 
    return [ tryint(c) for c in re.split('([0-9]+)', s) ] 

def sort_nicely(l): 
    """ Sort the given list in the way that humans expect. 
    """ 
    l.sort(key=alphanum_key) 

data=[ 
    'title_text #49', 
    'title_text #5', 
    'title_text #50'] 
sort_nicely(data) 
print(data) 
# ['title_text #5', 'title_text #49', 'title_text #50'] 

편집 :

data=[{'title': 'title_text #49', 'x':0}, 
     {'title':'title_text #5', 'x':10}, 
     {'title': 'title_text #50','x':20}] 

data.sort(key=lambda x: alphanum_key(x['title'])) 
# [{'x': 10, 'title': 'title_text #5'}, {'x': 0, 'title': 'title_text #49'}, {'x': 20, 'title': 'title_text #50'}] 
+0

나는 그걸 가지고 있습니다. 그러나 만약 당신의 데이터에 제목을 포함한 여러 값을 가진 dict이 있다면 어떻게 할 것입니까? 나는 함께 분류하고 싶습니까?) – wierddemon

+0

@wierddemon : 인간 정렬 기술의 핵심은'alphanum_key'에 있습니다. dicts의 목록을 보려면'data.sort (key = lambda x : alphanum_key (x [ 'title']))'와 같이 사용할 수 있습니다. 위 참조. – unutbu

+0

@unutbu : 하하, 너 정말 대단해, ​​고마워! – wierddemon

0

가 수동으로 제목에서 그 정수를 구문 분석해야합니다. 이 함수는 그것을 할 것입니다.

def parse_title_num(title): 
    val = 0 
    try: 
     val = int(title.rsplit('#')[-1]) 
    except ValueError: 
     pass 
    return val 


list.sort(key=lambda x: parse_title_num(x['title']) 
관련 문제