【问题标题】:Sorting dicts (contained in lists) alphanumerically in Python在 Python 中按字母数字对字典(包含在列表中)进行排序
【发布时间】:2011-03-14 23:11:43
【问题描述】:

我在对包含字典的列表进行排序时遇到问题。目前我正在通过一个名为“title”的键对其进行排序,其中包含以下行:

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

问题是我的一些数据被排序如下:

title_text #49
title_text #5
title_text #50

我将如何以一种对人类消费更友好的方式对其进行排序,同时仍保持标题排序?

【问题讨论】:

  • 你有没有机会让你的数字在左边补0?即 title_text #5 为 title_text #05 - 那么你就不需要“修复”排序

标签: python list sorting dictionary


【解决方案1】:

您正在寻找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 是一个字典列表,那么:

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

【讨论】:

  • 我已经做到了,但是如果你的数据包含一个包含多个值的字典,包括标题(我想要排序),你会怎么做?
  • @wierddemon:人类排序技术的核心在于alphanum_key。对于字典列表,您可以像这样使用它:data.sort(key=lambda x: alphanum_key(x['title']))。见上文。
【解决方案2】:

【讨论】:

    【解决方案3】:

    您必须手动从标题中解析该整数。这个函数会做的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2021-03-10
      • 2010-10-28
      • 2019-02-14
      • 2013-07-27
      相关资源
      最近更新 更多