-1

I am new to python and am doing an lab 6 problem in CS50 but got into the error: List index out of rang. Even though I have recheck many times and also watch the hint video of the course,I still couldn't find out a way to fix this problem. Please help me.

Here is my code:

# 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
    with open(sys.argv[1], "r") as file:
        reader = csv.DictReader(file)
        # The line 22 is to skip the first line of the csv file
        next (reader)
        for row in reader:
            row["rating"] = int(row["rating"])
            teams.append(row)
    counts = {}
    # TODO: Simulate N tournaments and keep track of win counts
    for i in range(0,N,1):
        winner = simulate_tournament(teams)
        if winner in counts:
            counts[winner] += 1
        else:
            counts[winner] = 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."""
    while len(teams) > 1:
        teams = simulate_round(teams)
    # "team" because the name "team" is define in the csv file. Because each element in teams list is a dictionary therefore
    # we need to add ["team"] meaning we will only return the name of the final winning team
    return teams[0]["team"]

if __name__ == "__main__":
    main()

and when running, I got this error:

Traceback (most recent call last):
  File "/workspaces/86940196/world-cup/tournament.py", line 70, in <module>
    main()
  File "/workspaces/86940196/world-cup/tournament.py", line 29, in main
    winner = simulate_tournament(teams)
  File "/workspaces/86940196/world-cup/tournament.py", line 64, in simulate_tournament
    teams = simulate_round(teams)
  File "/workspaces/86940196/world-cup/tournament.py", line 53, in simulate_round
    if simulate_game(teams[i], teams[i + 1]):
IndexError: list index out of range

I did try adding i = 0 before every for loop using variable i but it didn't work either :(

tth249
  • 1
  • 1

1 Answers1

0

I just realize that when using csv.DictReader, the function will automatedly treats the first line as the “keys” so there is no need to add next(reader). And after deleted that line, everything works out perfectly now.

tth249
  • 1
  • 1