Skip to content
Advertisement

Order CSV with two digit numbers

I’m trying to create a leaderboard for a game, where after the game has been played, the python script accesses a CSV file (not ordered) and prints out the top 5 people with the highest score. Python seems to do this fine with single-digit numbers, but I can’t get it to work with 2 digit numbers. Here is the code:

import csv
import operator

sample = open('csv_sample2.txt', 'r')

csv1 = csv.reader(sample,delimiter=',')

sort = sorted(sample, key=operator.itemgetter(1))

for eachline in sort:
    print(eachline)

and here is the output: (I just used placeholder names for now)

['Matt Damon', ' 12']
['Robin Williams', ' 14']
['Billy Crystal', ' 15']
['Minnie Driver', ' 17']
['Peter Sellers', ' 6']
['Robert De Niro', ' 8']
['Stanley Kubrick', ' 9']

and here is the original leaderboard file:

Matt Damon, 12
Robert De Niro, 8
Billy Crystal, 15
Peter Sellers, 6
Stanley Kubrick, 9
Robin Williams, 14
Minnie Driver, 17

How do I get it to order the numbers properly?

Advertisement

Answer

I suggest simply reading the file with file.readlines() and then processing the finished results.

Input File:

Matt Damon, 12
Robert De Niro, 8
Billy Crystal, 15
Peter Sellers, 6
Stanley Kubrick, 9
Robin Williams, 14
Minnie Driver, 17

Code:

data = []
with open('your_file.txt', 'r') as f:
    scores = f.readlines()
    # data is a list of tuples with a string name as the 
    # first value and a integer score as the second value
    data = [ ( s.strip().split(', ')[0], int(s.strip().split(', ')[1]) ) for s in scores ]

sorted_data = sorted(data, key=lambda tup: tup[1], reverse=True)

for name, score in sorted_data:
    print(f'{name} got a score of {score}')

# Prints:
# Minnie Driver got a score of 17
# Billy Crystal got a score of 15
# Robin Williams got a score of 14
# Matt Damon got a score of 12
# Stanley Kubrick got a score of 9
# Robert De Niro got a score of 8
# Peter Sellers got a score of 6

To print out only the first five scores from the ordered list sorted_data, use a for x in range() loop:

for x in range(5):
    name, score = sorted_data[x]
    print(f'{name} got a score of {score}')

This for loop will run 5 times. It unpacks the name and score contained in the tuple stored at sorted_data x, and then prints out that data.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement