2016-11-03 29 views
0

首先我創造這樣如何通過多個屬性對對象列表進行排序,其中一些屬性在python中具有相同的值?

class Student: 
    def __init__(self, name, grade, age): 
      self.name = name 
      self.grade = grade 

類然後,我有學生對象

L = [(Student: Tim, 99), (Student: Alice, 99), (Student: Bob, 88)] 

列表此列表降序得分次序如果兩個具有相同的我怎麼能進行排序,然後得分,按名稱上按字母順序

我曾嘗試使用attrgetter排序,但我總是得到這樣所述L-同一列表

預期的輸出是

L = [ (Student: Alice, 99),(Student: Tim, 99), (Student: Bob, 88)]

+3

'L.sort(鍵=拉姆達S:( - s.grade,s.name))'' –

回答

0

您可以在排序方法

sortedL = sorted(L, key=lambda student: student.name) 
0

添加關鍵ARG定義可以作爲排序的關鍵參數的函數。你定義功能,使您可以指定它是如何排序

>>> sorted(student_tuples, key=itemgetter(1,2)) 
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] 

>>> sorted(student_objects, key=attrgetter('grade', 'age')) 
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] 

https://wiki.python.org/moin/HowTo/Sorting

-1

默認情況下sorted使用,您比較對象的__cmp__方法。

class Student(object): 

    def __init__(self, name, grade, age): 
     self.name = name 
     self.grade = grade 
     self.age = age 

    def __cmp__(self, other): 
     if self.grade < other.grade: 
      return +1 
     elif self.grade > other.grade: 
      return -1 
     else: 
      return cmp(self.name, other.name) 

    def __repr__(self): 
     return "({}, {})".format(self.name, self.grade) 

s1 = Student('Tim', 99, 12) 
s2 = Student('Alice', 99, 12) 
s3 = Student('Bob', 88, 13) 

sorted([s1, s2, s3]) 
+0

__cmp__'(和'cmp')已被棄用和不必要的反正。 Py3專門使用'__lt__',而Py2則很樂意使用'__lt__',只需要測試'__lt__'通常會更快。除此之外,實施對班級的比較意味着這是學生的一般自然排序,當我非常懷疑大多數人會認爲學生的抽象概念主要按年級排列。使用'list.sort' /'sorted'的'key'參數(只調用'n'次)會更好,更快速(因爲它避免了用戶定義的慢函數的'n log n'調用) 。 – ShadowRanger

相關問題