栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Python中按多个键对对象排序?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Python中按多个键对对象排序?

此答案适用于字典中的任何列-否定的列不必是数字。

def multikeysort(items, columns):    from operator import itemgetter    comparers = [((itemgetter(col[1:].strip()), -1) if col.startswith('-') else       (itemgetter(col.strip()), 1)) for col in columns]    def comparer(left, right):        for fn, mult in comparers: result = cmp(fn(left), fn(right)) if result:     return mult * result        else: return 0    return sorted(items, cmp=comparer)

您可以这样称呼它:

b = [{u'TOT_PTS_Misc': u'Utley, Alex', u'Total_Points': 96.0},     {u'TOT_PTS_Misc': u'Russo, Brandon', u'Total_Points': 96.0},     {u'TOT_PTS_Misc': u'Chappell, Justin', u'Total_Points': 96.0},     {u'TOT_PTS_Misc': u'Foster, Toney', u'Total_Points': 80.0},     {u'TOT_PTS_Misc': u'Lawson, Roman', u'Total_Points': 80.0},     {u'TOT_PTS_Misc': u'Lempke, Sam', u'Total_Points': 80.0},     {u'TOT_PTS_Misc': u'Gnezda, Alex', u'Total_Points': 78.0},     {u'TOT_PTS_Misc': u'Kirks, Damien', u'Total_Points': 78.0},     {u'TOT_PTS_Misc': u'Worden, Tom', u'Total_Points': 78.0},     {u'TOT_PTS_Misc': u'Korecz, Mike', u'Total_Points': 78.0},     {u'TOT_PTS_Misc': u'Swartz, Brian', u'Total_Points': 66.0},     {u'TOT_PTS_Misc': u'Burgess, Randy', u'Total_Points': 66.0},     {u'TOT_PTS_Misc': u'Smugala, Ryan', u'Total_Points': 66.0},     {u'TOT_PTS_Misc': u'Harmon, Gary', u'Total_Points': 66.0},     {u'TOT_PTS_Misc': u'Blasinsky, Scott', u'Total_Points': 60.0},     {u'TOT_PTS_Misc': u'Carter III, Laymon', u'Total_Points': 60.0},     {u'TOT_PTS_Misc': u'Coleman, Johnathan', u'Total_Points': 60.0},     {u'TOT_PTS_Misc': u'Venditti, Nick', u'Total_Points': 60.0},     {u'TOT_PTS_Misc': u'Blackwell, Devon', u'Total_Points': 60.0},     {u'TOT_PTS_Misc': u'Kovach, Alex', u'Total_Points': 60.0},     {u'TOT_PTS_Misc': u'Bolden, Antonio', u'Total_Points': 60.0},     {u'TOT_PTS_Misc': u'Smith, Ryan', u'Total_Points': 60.0}]a = multikeysort(b, ['-Total_Points', 'TOT_PTS_Misc'])for item in a:    print item

尝试对任一列取反。您将看到排序顺序相反。

下一步:对其进行更改,以使其不使用额外的类。


2016-01-17

从这个答案中汲取灵感,从满足条件的可迭代项中获取第一项的最佳方法是什么?,我缩短了代码:

from operator import itemgetter as idef multikeysort(items, columns):    comparers = [        ((i(col[1:].strip()), -1) if col.startswith('-') else (i(col.strip()), 1))        for col in columns    ]    def comparer(left, right):        comparer_iter = ( cmp(fn(left), fn(right)) * mult for fn, mult in comparers        )        return next((result for result in comparer_iter if result), 0)    return sorted(items, cmp=comparer)

如果您喜欢简洁的代码。


2016年1月17日晚

这适用于python3(消除了的

cmp
参数
sort
):

from operator import itemgetter as ifrom functools import cmp_to_keydef cmp(x, y):    """    Replacement for built-in function cmp that was removed in Python 3    Compare the two objects x and y and return an integer according to    the outcome. The return value is negative if x < y, zero if x == y    and strictly positive if x > y.    https://portingguide.readthedocs.io/en/latest/comparisons.html#the-cmp-function    """    return (x > y) - (x < y)def multikeysort(items, columns):    comparers = [        ((i(col[1:].strip()), -1) if col.startswith('-') else (i(col.strip()), 1))        for col in columns    ]    def comparer(left, right):        comparer_iter = ( cmp(fn(left), fn(right)) * mult for fn, mult in comparers        )        return next((result for result in comparer_iter if result), 0)    return sorted(items, key=cmp_to_key(comparer))

受此答案启发,如何在Python 3中自定义排序?



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451829.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号