Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Display Formating
#1
def line_up(roster):
    if len(roster)==0:
        print("There is no player in the list. \n")
        return
    else:
        i = 1
        for player in roster:
            row = player
            print("{:>2}{:10d}{:2d}{:2d}{:2d}{:2d}".format(str(i)+str(row[0])+str(row[1])+str(row[2])+str(row[3])+str(row[4])))
            i += 1
        print()
I am trying to format the spacing between rows however I get an "IndexError: tuple index out of range" error.
Any help would be useful.
Thanks in advance.
Reply
#2
The problem is in line #9: you pass only one argument to .format method, but 6 expected.
You code could be as follows:

def line_up(roster):
    if not roster:
        print("There is no player in the list. \n")
        return
    for i, row in enumerate(roster):
        print("{:>2}{:10d}{:2d}{:2d}{:2d}{:2d} \n".format(i + 1, *row))
>>>line_up([[1,2,3,4,5], [2,3,4,5,6,7]])
Output:
1 1 2 3 4 5 2 2 3 4 5 6
Reply
#3
After implementing your code
Player POS AB H AVG
--------------------------------------------------------------------------------
1J oeP1


2B en2B


3T omSS

The display only accounts for the first two rows and the first "row[0]" seems to only display the first letter with 10 spaces after then stuck to the rest of it is row[1]


import csv

FILENAME="roster.csv"

def write_lineup(roster):
    with open(FILENAME, "w", newline="") as file:
        writer = csv.writer(file)
        writer.writerows(roster)

def read_lineup():
    roster = []
    with open(FILENAME, newline="") as file:
        reader = csv.reader(file)
        for row in reader:
            roster.append(row)
        return roster


def menu():
    print("===============================================================================")
    print()
    print("                      Baseball Team Manager                     ")
    welcome_dis()

def welcome_dis():
    print("MENU OPTIONS")
    print("1 - Display lineup")
    print("2 - Add player")
    print("3 - Remove player")
    print("4 - Move player")
    print("5 - Edit player position")
    print("6 - Edit player stats")
    print("7 - Exit program")
    print()
    print("POSITIONS\nC, 1B, 2B, 3B, SS, LF, CF, RF, P")
    print("===============================================================================")

def cal_average(hit,at_bat):
    if at_bat != 0:
        average = float(round(hit/at_bat, 3))
        return average
    else:
        return 0
    
def line_up(roster):
    if not roster:
        print("There is no player in the list. \n")
        return
    for i, row in enumerate(roster):
        print("{:>2}{:10}{:1}{:1}{:1}{:1}\n".format(i + 1, *row[0]+str(row[1])+str(row[2])+str(row[3])+str(row[4])))
        print()
        

#def line_up(roster):
#    if len(roster)==0:
#        print("There is no player in the list. \n")
#        return
#    else:
#        i = 1
#        for player in roster:
#           row = player
#            print("{:<2}{:10}{:2}{:2}{:2}{:2}")+str(i)+str(row[0]),
#                  +str(row[1])
#                  +str(row[2])
#                  +str(row[3])
#                  +str(row[4])
#            i += 1
#        print()

def add_player(roster):
    name = input("Name: ")
    position = input("Position: ")
    at_bat = int(input("At bats: "))
    hit = int(input("Hits: "))
    average = cal_average(hit,at_bat)
    player = []
    player.append(name)
    player.append(position)
    player.append(at_bat)
    player.append(hit)
    player.append(average)
    roster.append(player)
    write_lineup(roster)
    print(player[0] + " was added. \n")

def remove_player(roster):
    number = int(input("Number: "))
    if number < 1 or number > len(roster):
        print("Invalid player number. \n")
    else:
        player = roster.pop(number - 1)
        write_lineup(roster)
        print(player[0] + " was removed. \n")

def move_player(roster):
    number = int(input("Current lineup number: "))
    player = roster.pop(number-1)
    
    #player = roster[number-1]
    #print(player[0], " was selected")
    newnumber=int(input("New lineup number: "))
    roster.insert(newnumber-1, player)
    print(player[0], " was moved")
    #removespot = player.pop(number-1)
    #player.insert(newnumber-1, removespot)
    write_lineup(roster) 
    print()

def edit_position(roster):
    number = int(input("Enter lineup number: "))
    player = roster[number-1]
    print("You selected ", player[0], ' POS= ', player[1])
    #player.pop(1)
    newposition = input("Position: ")
    player.insert(1,newposition)
    write_lineup(roster) 
    print(player[0], " was updated")
    print()

def edit_stats(roster):
    number = int(input("Enter lineup number: "))
    player = roster[number-1]
    print("You selected ",player[0], " AB=",player[2]," H=",player[3])
    #player.pop(2)
    #player.pop(3)
    at_bat = int(input("At bats: "))
    hit = int(input("Hits: "))
    player.insert(2,at_bat)
    player.insert(3,hit)
    write_lineup(roster)
    print(player[0], " was updated")
    print()   

def exit_menu():
    print("Bye!")
    

def main_menu():

    welcome_dis()
    roster = read_lineup()
    while True:
        menu = input("Menu option: ")
        if menu == "1":
            print("  Player\tPOS\tAB\tH\tAVG")
            print("--------------------------------------------------------------------------------")
            line_up(roster)
        elif menu == "2":
            add_player(roster)
        elif menu == "3":
            remove_player(roster)
        elif menu == "4":
            move_player(roster)
        elif menu == "5":
            edit_position(roster)
        elif menu == "6":
            edit_stats(roster)
        elif menu == "7":
            exit_menu()
            break
        else:
            print("Not a valid option. Please try again")
            main_menu()

if __name__ == "__main__":
    main_menu()
The entire program as follows.

MENU OPTIONS
1 - Display lineup
2 - Add player
3 - Remove player
4 - Move player
5 - Edit player position
6 - Edit player stats
7 - Exit program

POSITIONS
C, 1B, 2B, 3B, SS, LF, CF, RF, P
===============================================================================
Menu option: 1
Player POS AB H AVG
--------------------------------------------------------------------------------
1 Joe P 10 2 0.2
2 Ben 1B 0 0 0.0
3 Tom SS 11 4 0.364
4 Mike C 0 0 0.0
5 Eric 3b 4 0 0.0
6 Joe 2b 3 1 0.333
7 Mike SS 0 0 0


def line_up(roster):
    if len(roster)==0:
        print("There is no player in the list. \n")
        return
    else:
        i = 1
        for player in roster:
            row = player
            print(str(i)+"  "+str(row[0])
                  +"\t\t"+str(row[1])+"   "
                  +"  "+str(row[2])+"    "
                  +"  "+str(row[3])+"   "
                  +"  "+str(row[4])+"\t")
            i += 1
        print()
How the program displayed before
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Formating for __repr__ Steven 5 4,281 Apr-23-2017, 11:02 PM
Last Post: ichabod801

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020