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」をループする必要があるかどうかわかりませんか? メソッドfastest_timeを実装する方法がわからない..助けてください

4

5 に答える 5

2

配列をループしてAthletes を作成する必要があります。

>>>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)

ただし、それ自体ではなく、smin()を含む配列に対して行われることに注意してください。最速のものを見つけたい場合は、クラスのようなものが必要になる場合があります。AthleteAthleteAthleteAthleteContainer

于 2013-03-16T20:21:21.543 に答える
1

最速のアスリートは具体的なインスタンスに依存しないものであるため、静的な方法としてより適切です。

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)
于 2013-03-16T20:30:41.990 に答える
0

メソッドをオーバーライドして、__gt__python のmaxfunctionを使用できます。また、各クラスはアスリートのリストではなく、1 人のアスリートを表す必要があります。

>>> 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
于 2013-03-16T20:40:53.027 に答える
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()
于 2013-03-16T20:36:52.400 に答える
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]

しかし、私は別のコメンターに同意します-アスリートはコレクションではなく、個別のオブジェクトであるべきです.

于 2013-03-16T20:36:54.340 に答える