CS50实验室6世界杯模拟回转功能问题



我的锦标赛.py程序似乎运行得很好,但通过check50运行它会出现一些错误,特别是使用simulate_turnation函数时,它说它没有正确返回获胜者的名字。这是我的代码:

# Simulate a sports tournament
import csv
import sys
import random
# Number of simluations to run
N = 1000

def main():
# Ensure correct usage
if len(sys.argv) != 2:
sys.exit("Usage: python tournament.py FILENAME")
teams = []
# TODO: Read teams into memory from file
f = open(sys.argv[1], "r")
handle = csv.DictReader(f)
for item in handle:
item['rating'] = int(item['rating'])
teams.append(item)
counts = {}
# TODO: Simulate N tournaments and keep track of win counts
for i in range(N):
winner = simulate_tournament(teams)
if winner['team'] in counts:
counts[winner['team']] += 1
else:
counts[winner['team']] = 1

# Print each team's chances of winning, according to simulation
for team in sorted(counts, key=lambda team: counts[team], reverse=True):
print(f"{team}: {counts[team] * 100 / N:.1f}% chance of winning")

def simulate_game(team1, team2):
"""Simulate a game. Return True if team1 wins, False otherwise."""
rating1 = team1["rating"]
rating2 = team2["rating"]
probability = 1 / (1 + 10 ** ((rating2 - rating1) / 600))
return random.random() < probability

def simulate_round(teams):
"""Simulate a round. Return a list of winning teams."""
winners = []
# Simulate games for all pairs of teams
for i in range(0, len(teams), 2):
if simulate_game(teams[i], teams[i + 1]):
winners.append(teams[i])
else:
winners.append(teams[i + 1])
return winners

def simulate_tournament(teams):
"""Simulate a tournament. Return name of winning team."""
# TODO
while len(teams) != 1:
teams = simulate_round(teams)
return teams[0]

if __name__ == "__main__":
main()

输出:

Brazil: 22.3% chance of winning
Belgium: 20.8% chance of winning
Portugal: 15.0% chance of winning
Switzerland: 10.8% chance of winning
Spain: 10.2% chance of winning
Argentina: 6.6% chance of winning
England: 3.4% chance of winning
France: 3.4% chance of winning
Denmark: 2.8% chance of winning
Croatia: 1.4% chance of winning
Colombia: 1.4% chance of winning
Mexico: 1.1% chance of winning
Sweden: 0.6% chance of winning
Uruguay: 0.2% chance of winning

是什么原因造成的?我仍然不太熟悉python中的列表和dict,或者python中的一般内容。

这是check50的结果:

:) tournament.py exists
:) tournament.py imports
:( simulate_tournament handles a bracket of size 2
simulate_tournament fails to return the name of 1 winning team
:( simulate_tournament handles a bracket of size 4
simulate_tournament fails to return the name of 1 winning team
:( simulate_tournament handles a bracket of size 8
simulate_tournament fails to return the name of 1 winning team
:( simulate_tournament handles a bracket of size 16
simulate_tournament fails to return the name of 1 winning team
:) correctly keeps track of wins
:) correctly reports team information for Men's World Cup
:) correctly reports team information for Women's World Cup

感谢您的回答Gennaro,这给了我一个定义simulate_tournament函数的想法,如下所示,它也起到了作用:

def simulate_tournament(teams):
"""Simulate a tournament. Return name of winning team."""
# TODO
while len(teams) != 1:
teams = simulate_round(teams)
winner = teams[0]
return winner["team"]

看到获胜者变成一个dict,它具有与键"相关联的值;团队";,这个值就是获胜者的名字。

idk为什么但check50不能识别"name";,我使用以下代码解决了问题:

def simulate_tournament(teams):
# Simulate a tournament. Return name of winning team.
teamleft =list()
teamsLeft = teams
while len(teamsLeft) != 1:
teamsLeft = simulate_round(teamsLeft)
winner=teamsLeft[0]
winnerValues = list(winner.values())
return winnerValues[0]

我创建了一个列表,其中包含获胜国家的名称和他的排名,然后我返回了list[0],所以名称,这就起了作用。

defsimulate_turnation(teams(必须返回字符串(而不是列表(。这是一项测试要求。

最新更新