根据多个属性对列表进行排序?

根据多个属性对列表进行排序?

我有一份清单:

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

如果我想按一个元素进行排序,比如说,高个子/矮个子元素,我可以通过s = sorted(s, key = itemgetter(1)).

如果我想双管齐下高/矮和颜色,我可以做两次,每一个元素一次,但有更快的方法吗?


波斯汪
浏览 771回答 3
3回答

慕姐8265434

键可以是返回元组的函数:s = sorted(s, key = lambda x: (x[1], x[2]))或者你也可以实现同样的使用itemgetter(这样做速度更快,避免了Python函数调用):import operator s = sorted(s, key = operator.itemgetter(1, 2))注意这里你可以用sort而不是使用sorted然后重新分配:s.sort(key = operator.itemgetter(1, 2))

一只萌萌小番薯

我不确定这是否是最重要的一种.我有一个元组列表,需要按降序整数值和第二个字母排序。这需要反转整数排序,而不是字母排序。这是我的解决方案:(在考试中,我甚至不知道你可以“嵌套”排序函数)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..这一点变得更加重要,我认为当您获取属性而不是列表/元组的“神奇索引”时。在我的例子中,我想按类的多个属性进行排序,其中传入的键是字符串。我需要在不同的地方进行不同的排序,并且我希望对客户机正在与之交互的父类进行公共的默认排序;只需要在真正“需要”时重写“排序键”,但也可以将它们存储为类可以共享的列表。所以首先我定义了一个帮助方法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 consisenessself.SortListA = ['attrA', 'attrB'] self.SortListB = ['attrC', 'attrA']records = ....  #list of my objects to sortrecords.sort(key=self.attr_sort(attrs=self.SortListA)) # perhaps later nearby or in another functionmore_records = ....  #another listmore_records.sort(key=self.attr_sort(attrs=self.SortListB))这将使用生成的lambda函数对列表进行排序。object.attrA然后object.attrB假设object具有与提供的字符串名称相对应的getter。第二个案子object.attrC然后object.attrA.这还允许您将外部排序选项公开给使用者,单元测试,或者让它们告诉您如何对API中的某些操作进行排序,只需给出一个列表,而不是将它们耦合到后端实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python