2013-03-16 92 views
0

我需要實現一類叫做運動員這需要一個__init__(self,names,fastest_time) 並呼籲fastest_time另一種方法,這將顯示速度最快的運動員的名字和時間:面向對象的編程蟒蛇

到目前爲止,我有這樣的:

class Athlete: 
    def __init__(self,names,ftime): 
     self.name=names 
     self.fastest=ftime 
    def fastest_athlete(self): 


names=(['sara','jam','mary']) 
times=([90,50,75]) 
a=Athlete(name,ftime) 
a.fastest_athlete() 

問題:不知道是否需要遍歷數組名'times'?不知道如何實現方法faster_time..HELP請

+0

是的,你的傾向是正確的。你應該循環「名字」和「時間」,爲每個運動員創建一個對象。提示:'zip()'將幫助你同時循環兩次。 – bernie 2013-03-16 20:16:42

+0

你的oo設計是錯誤的。一名運動員應該代表一名運動員,並且不應該將名單和時間列表傳遞給它。 – jurgenreza 2013-03-16 20:18:32

+0

謝謝!什麼是zip()?以前從來沒有聽說過它..有沒有更簡單的方法或拉鍊的唯一途徑? – 2013-03-16 20:18:38

回答

2

你應該循環數組創建Athlete s。

>>>Athletes = [Athlete(name, time) for name, time in zip(names, times)]  
>>>Athletes[0].name 
sara 
>>>Athletes[1].name 
jam 

很好,找到最快的運動員,你可以使用maxmin功能。

>>>min(Athletes, key = lambda a : a.fastest) 

但你應該注意到,min()是一個包含Athlete S,不是在Athlete本身的陣列上進行。如果你想找到最快的Athlete,你可能需要類似AthleteContainer類。

+0

有一個輕微修改上面的代碼: – 2013-03-16 20:25:32

+0

類運動員: DEF __init __(個體,名稱,FTIME): self.name =名 self.fastest = FTIME DEF fastest_athlete(個體): 名稱=( ['薩拉','果醬','瑪麗']) times =([90,50,75]) a =運動員(姓名,次數) a.fastest_athlete() – 2013-03-16 20:25:49

+0

我不知道如果方法最快時間應該採取名稱和時間..迷惑怎麼辦 – 2013-03-16 20:26:33

1

由於速度最快的運動員的東西,不依賴於一個具體的實例,它更appropiate作爲一個靜態方法:

class Athlete: 
    # ... 
    @staticmethod 
    def fastest_athlete(athletes): 
     return reduce(lambda x, y: x if x.fastest < y.fastest else y, athletes) 

# ... 
athletes = [Athlete(name, time) for name, time in zip(names, times)] 
fastest = Athlete.fastest_athlete(athletes) 
0

如果你想fastest_athlete成爲運動員類的一部分,那麼你Athlete上課應該能夠到達所有運動員。

fastest_athlete會返回一個列表,因爲可能會有更多運動員跑最佳時間。

athletes=[] # stores all athletes 

class Athlete: 
    def __init__(self,names,ftime): 
     self.name=names 
     self.fastest=ftime 
     athletes.append(self) 
    def fastest_athlete(self): 
     besttime= min([athlete.fastest for athlete in athletes]) 
     return [athlete.name for athlete in athletes if athlete.fastest==besttime] 



names=(['sara','jam','mary']) 
times=([90,50,75]) 

for a, t in zip(names, times): 
    last_athlete=Athlete(a, t) 

print last_athlete.fastest_athlete() 
+0

heyy謝謝!它的工作原理,但我不明白這個位besttime = min([athlete.fastest運動員在運動員]) 請問你能解釋給我更多的細節?謝謝 – 2013-03-16 20:40:22

+0

運動員是包含每個運動員的列表。
[]部分返回包含每個運動員每次的列表。 min([])返回所有的最小(最佳)時間。 「返回」爲最快時間等於最佳時間的所有運動員過濾相同的運動員列表,然後將其名稱作爲列表返回。 – drjors 2013-03-18 15:56:46

0

如果你只是想循環數組self.name然後在:

for name in self.names: 
    # Do something 

但對於實際的問題:

def fastest_athlete(self): 
    combined = zip(self.names, self.fastest) 

    #Note that this will return the athlete with the first fastest time if there are dupes 
    index = self.fastest.index(min(self.fastest)) 

    #If you want multiples: 
    indices = [i for i,n in enumerate(self.fastest) if n == min(self.fastest)] 

    #Either return the list (combined[0] is the athlete's name, combined[1] is the associated time) or print it here. 
    return combined[index] 

不過,我同意另一個評論 - 運動員應單獨的對象,而不是一個集合。

0

你可以覆蓋__gt__方法並使用python的max函數。每個班級也應代表一名運動員,而不是運動員名單。

>>> class Athlete: 
    name = None 
    time = None 

    def __init__(self, name, time): 
     self.name = name 
     self.time = time 

    def __gt__(self, other): 
     return self.time > other.time 

>>> names = ['sara', 'jam', 'mary'] 
>>> times = [90 ,50 , 75] 
>>> 
>>> athletes = [Athlete(name, time) for name, time in zip(names, times)] 
>>> 
>>> fastest = max(athletes) 
>>> fastest.name 
'sara' 
>>> fastest.time 
90