按多个属性对列表进行sorting?

我有一个列表清单:

[[12, 'tall', 'blue', 1], [2, 'short', 'red', 9], [4, 'tall', 'blue', 13]] 

如果我想sorting一个元素,说高/短元素,我可以通过s = sorted(s, key = itemgetter(1))

如果我想按照高/短和颜色进行sorting,我可以做两次,每次做一次,但是有更快的方法吗?

一个键可以是一个返回一个元组的函数:

 s = sorted(s, key = lambda x: (x[1], x[2])) 

或者你可以使用itemgetter来实现相同的function:

 import operator s = sorted(s, key = operator.itemgetter(1, 2)) 

并注意,在这里你可以使用sort而不是使用sorted ,然后重新分配:

 s.sort(key = operator.itemgetter(1, 2)) 

我不知道这是否是最pythonic方法…我有一个元组列表,需要按降序整数值sorting第一和字母顺序第二。 这需要颠倒整数sorting而不是按字母sorting。 这是我的解决scheme:(在考试顺便说一句,我甚至不知道你可以'嵌套'sorting函数)

 a = [('Al', 2),('Bill', 1),('Carol', 2), ('Abel', 3), ('Zeke', 2), ('Chris', 1)] b = sorted(sorted(a, key = lambda x : x[0]), key = lambda x : x[1], reverse = True) print(b) [('Abel', 3), ('Al', 2), ('Carol', 2), ('Zeke', 2), ('Bill', 1), ('Chris', 1)] 

看来你可以使用一个list而不是一个tuple 。 当你抓取属性而不是列表/元组的“魔术索引”时,这变得更重要。

在我的情况下,我想sorting一个类的多个属性,其中传入的键是string。 我需要在不同的地方进行不同的sorting,并且我想要一个与客户端交互的父类的通用默认sorting。 当我真的需要时,只需要重写“sorting键”,但也可以将它们存储为类可以共享的列表

所以首先我定义了一个辅助方法

 def attr_sort(self, attrs=['someAttributeString']: '''helper to sort by the attributes named by strings of attrs in order''' return lambda k: [ getattr(k, attr) for attr in attrs ] 

然后使用它

 # would defined elsewhere but showing here for consiseness self.SortListA = ['attrA', 'attrB'] self.SortListB = ['attrC', 'attrA'] records = .... #list of my objects to sort records.sort(key=self.attr_sort(attrs=self.SortListA)) # perhaps later nearby or in another function more_records = .... #another list more_records.sort(key=self.attr_sort(attrs=self.SortListB)) 

这将使用生成的lambda函数按object.attrA对列表进行sorting,然后使用object.attrB假定object具有与提供的string名称相对应的getter。 第二种情况将按object.attrC进行sorting。

这也使得你可能将外部sortingselect暴露给消费者,unit testing,或者让他们告诉你如何在你的api中执行一些操作来完成sorting,只需要给你一个列表而不是将它们耦合到您的后端实现。