python PTA 1004 成績排名

2021-10-04 12:16:54 字數 4757 閱讀 9121

你想讓某個類的例項支援標準的比較運算(比如》=,!=,<=,《等),但是又不想去實現那一大丟的特殊方法。

python類對每個比較操作都需要實現乙個特殊方法來支援。 例如為了支援》=操作符,你需要定義乙個ge() 方法。 儘管定義乙個方法沒什麼問題,但如果要你實現所有可能的比較方法那就有點煩人了。

裝飾器 functools.total_ordering 就是用來簡化這個處理的。 使用它來裝飾乙個來,你只需定義乙個eq() 方法, 外加其他方法(lt(<),le(<=),gt(>), orge(>=))中的乙個即可。 然後裝飾器會自動為你填充其它比較方法。

作為例子,我們構建一些房子,然後給它們增加一些房間,最後通過房子大小來比較它們:

from functools import total_ordering

class

room

:def

__init__

(self, name, length, width)

: self.name = name

self.length = length

self.width = width

# 不需要傳參的就不用在括號裡面寫了

self.square_feet = self.length * self.width

@total_ordering

class

house

:def

__init__

(self, name, style)

: self.name = name

self.style = style

self.rooms =

list()

defadd_room

(self, room)

: @property

defliving_space_footage

(self)

:# 因為property 可以直接這樣呼叫函式

return

sum(r.square_feet for r in self.rooms)

# 最後想要輸出什麼樣的結果

def__str__

(self)

:return

'{}: {} square foot {}'

.format

(self.name,

self.living_space_footage,

self.style)

def__eq__

(self, other)

:# 因為傳入了property ,所以直接加點呼叫就可以了。

return self.living_space_footage == other.living_space_footage

def__lt__

(self, other)

:return self.living_space_footage < other.living_space_footage

# build a few houses, and add rooms to them

h1 = house(

'h1'

,'cape'

)h1.add_room(room(

'master bedroom',14

,21))

h1.add_room(room(

'living room',18

,20))

h1.add_room(room(

'kitchen',12

,16))

h1.add_room(room(

'office',12

,12))

h2 = house(

'h2'

,'ranch'

)h2.add_room(room(

'master bedroom',14

,21))

h2.add_room(room(

'living room',18

,20))

h2.add_room(room(

'kitchen',12

,16))

h3 = house(

'h3'

,'split'

)h3.add_room(room(

'master bedroom',14

,21))

h3.add_room(room(

'living room',18

,20))

h3.add_room(room(

'office',12

,16))

h3.add_room(room(

'kitchen',15

,17))

houses =

[h1, h2, h3]

print

('is h1 bigger than h2?'

, h1 > h2)

# prints true

print

('is h2 smaller than h3?'

, h2 < h3)

# prints true

print

('is h2 greater than or equal to h1?'

, h2 >= h1)

# prints false

print

('which one is biggest?'

,max

(houses)

)# prints 'h3: 1101-square-foot split'

print

('which is smallest?'

,min

(houses)

)# prints 'h2: 846-square-foot ranch'

題目練習

讀入 n(>0)名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。

輸入格式:

每個測試輸入包含 1 個測試用例,格式為

第 1 行:正整數 n

第 2 行:第 1 個學生的姓名 學號 成績

第 3 行:第 2 個學生的姓名 學號 成績

… … …

第 n+1 行:第 n 個學生的姓名 學號 成績

其中姓名和學號均為不超過 10 個字元的字串,成績為 0 到 100 之間的乙個整數,這裡保證在一組測試用例中沒有兩個學生的成績是相同的。

輸出格式:

對每個測試用例輸出 2 行,第 1 行是成績最高學生的姓名和學號,第 2 行是成績最低學生的姓名和學號,字串間有 1 空格。

輸入樣例:

3

joe math990112 89

mike cs991301 100

mary ee990830 95

輸出樣例:

mike cs991301

joe math990112

**思路:進行類的比較,需要匯入total_ordering,這樣比較兩個物件就可以了;將所有的例項物件都放在乙個列表裡,重新建造輸入函式__str__,就可以輸出想要的結果了。

from functools import total_ordering

@total_ordering

class

student

:def

__init__

(self, name,

id, score)

: self.name = name

self.id=

id self.score = score

def__eq__

(self, other)

:return self.score == other.score

def__lt__

(self, other)

:return self.score < other.score

def__str__

(self)

:return

" ".

format

(self.name, self.id)

n =input()

lst =

for i in

range

(int

(n))

: line =

input()

line = line.split(

" ")

s = student(line[0]

, line[1]

,int

(line[2]

))print

(max

(lst)

)print

(min

(lst)

)

###############執行結果####################

3

joe math990112 89

mike cs991301 100

mary ee990830 95

mike cs991301

joe math990112

總結:python裡面一切皆物件,所以物件也可以作為函式的引數使用。

1004成績排名

讀入n名學生的姓名 學號 成績,分別輸出成績最高和成績最低學生的姓名和學號。輸入格式 每個測試輸入包含1個測試用例,格式為 第1行 正整數n 第2行 第1個學生的姓名 學號 成績 第3行 第2個學生的姓名 學號 成績 第n 1行 第n個學生的姓名 學號 成績其中姓名和學號均為不超過10個字元的字串,...

1004 成績排名

讀入n名學生的姓名 學號 成績,分別輸出成績最高和成績最低學生的姓名和學號。輸入格式 每個測試輸入包含1個測試用例,格式為 第1行 正整數n 第2行 第1個學生的姓名 學號 成績 第3行 第2個學生的姓名 學號 成績 第n 1行 第n個學生的姓名 學號 成績其中姓名和學號均為不超過10個字元的字串,...

1004 成績排名

這個相對來說比較簡單,但是沒能一次執行成功。要記得 結構體存資料取位址 include include include pragma warning disable 4996 int main struct student x scanf d n x struct student malloc n ...