Сортировка слов (содержится в списках) в алфавитном порядке в Python - PullRequest
3 голосов
/ 12 июля 2010

У меня проблема с сортировкой списка, содержащего диктат. В настоящее время я сортирую его по ключу с названием 'title' со следующей строкой:

list.sort(key=operator.itemgetter('title'))

Проблема в том, что некоторые мои данные сортируются в следующем виде:

title_text #49
title_text #5
title_text #50

Как бы я мог отсортировать его так, чтобы он был более дружественным для человека, при этом сохраняя сортировку заголовков?

Ответы [ 3 ]

4 голосов
/ 12 июля 2010

Вы ищете сортировку людей .

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 является списком диктов, то:

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'}]
2 голосов
/ 12 июля 2010
0 голосов
/ 12 июля 2010

Вам нужно будет вручную разобрать это целое число из заголовка. Эта функция сделает это.

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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...