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

如何在Python中按多个键对对象排序?,第1张

如何在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中自定义排序?



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5427355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存