在Python中对包含字典的列表按字母数字排序

3 投票
3 回答
987 浏览
提问于 2025-04-16 01:11

我在处理一个包含字典的列表时遇到了问题。目前,我是通过一个叫做'title'的键来排序的,代码如下:

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

这样做的问题是,我的一些数据排序后看起来像这样:

title_text #49
title_text #5
title_text #50

我该如何排序才能让人更容易理解,同时又能保持按标题排序呢?

3 个回答

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

你想要实现一种自然排序。可以从这里开始了解:

Python中类似natsort函数的用法(使用“自然顺序”算法对列表进行排序)

4

你在寻找一种叫做人性化排序的方法。

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

撰写回答