亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

如何解決:“如果list不僅僅包含 Student 類,則 __cmp__ 可能會報錯”

L = [Student('Tim', 99), Student('Bob', 88), 100, 'Hello']
print sorted(L)

正在回答

3 回答

當含有其他類是,可以判斷其他類的類型。例如有數字和字符串,數字和分數比較,字符串和名字比較

??? def __cmp__(self, s):
??????? if isinstance(s,Student):
??????????? if self.score<s.score:
??????????????? return -1
??????????? elif self.score>s.score:
??????????????? return 1
??????????? else:
??????????????? if self.name<s.name:
??????????????????? return -1
??????????????? elif self.name>s.name:
??????????????????? return 1
??????????????? else:
??????????????????? return 0
??????? elif isinstance(s,str):
??????????? if self.name<s:
??????????????? return -1
??????????? elif self.name>s:
??????????????? return 1
??????????? else:
??????????????? return 0
??????? elif isinstance(s,int):
??????????? if self.score<s:
??????????????? return -1
??????????? elif self.score>s:
??????????????? return 1
??????????? else:
??????????????? return 0

這樣寫有點復雜,不如重寫一個cmp方法,重復調用

當然也可以按照其他同學的方法:同類的話進行比較,不同類的話順序不變。但是此方法有問題:如果是中間夾帶,那么只比較前后順序使得最后結果不對。

Ex:L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 99),100,'Hello',Student('im', 99)] 最后結果為只排序了前半段。

[(Bob: 88), (Alice: 99), (Tim: 99), 100, 'Hello', (im: 99)]

1 回復 有任何疑惑可以回復我~
#1

kall778

你把im:99改成im:98,它就會排在BOb:88的后面的~,結果有什么不對的?
2015-05-18 回復 有任何疑惑可以回復我~
s1?=?Student('Alice','female',18,'Middle?school',87)
s2?=?Student('Bob','male',17,'Middle?school',78)

def?fn_cmp(obj1,obj2):
????if?obj1.__str__()?>?obj2.__str__():
????????return?-1
????else:
????????return?0

L=[s1,s2,"hello",13]
print?sorted(L,fn_cmp)

例如這樣

0 回復 有任何疑惑可以回復我~

可以自己寫一個比較函數來處理?[Student('Tim', 99), Student('Bob', 88), 100, 'Hello'] 這樣的狀況,然后把L和函數同時傳給sorted()

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
python進階
  • 參與學習       255563    人
  • 解答問題       3038    個

學習函數式、模塊和面向對象編程,掌握Python高級程序設計

進入課程

如何解決:“如果list不僅僅包含 Student 類,則 __cmp__ 可能會報錯”

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號