Finding the top 10 and converting it from centimeters to inches - Python -


i reading data file, listed below, .dat file:

1 carmella henderson 24.52 13.5 21.76 2 christal piper 14.98 11.01 21.75 3 erma park 12.11 13.51 18.18 4 dorita griffin 20.05 10.39 21.35 

the file contains 50 records. data need person number, name , first number, so:

1 #person number marlon holmes  #name 18.86 # first number 13.02 # second number 13.36 # third number 

i have code read data unable top 10 results based on #first number

the #first number in top 10 in centimeters needs converted inches, unsure on how combine top 10 , conversion 1 alongside reading of data

code reads data:

 open('veggies_2016.txt', 'r') f:         count = 0         excess_count = 0         line in f:             if count < 3:                 print(line)                 count += 1             elif count == 3 , excess_count < 1:                 excess_count += 1             else:                 count = 0                 excess_count = 0 

as mentioned code reads file, #person number, #name , #first number, #first number needs converted inches , of data needs sorted find top 10

this process have repeated #second number , #third number separate in terms of code #first number

i have tried read data append list , sort , convert no success, appreciated

whole code:

from collections import ordereddict operator import itemgetter import pprint def menu():     exit = false       while not exit:         print("to enter new competitior data, type new")         print("to view competition score boards, type scoreboard")         print("to view best overall growers scoreboard, type podium")         print("to review years , previous data, type data review")         print("type quit exit program")          choice = raw_input("which option like?")          if choice == 'new':             new_competitor()         elif choice == 'scoreboard':             scoreboard_menu()         elif choice == 'podium':             podium_place()         elif choice == 'data review':             data_review()         elif choice == 'quit':             print("goodbye")             raise systemexit  """entering new competitor data: record competitor's name , vegtables lengths"""  def competitor_data():     global competitor_num     l = []      print("how many competitors enter?")      competitors = raw_input("number of competitors:")      num_competitors = int(competitors)      in range(num_competitors):          name = raw_input("enter competitor name:")         cucumber = raw_input("enter length of cucumber:")         carrot = raw_input("enter length of carrot:")         runner_beans = raw_input("enter length of runner beans:")          l.append(competitor_num)         l.append(name)         l.append(cucumber)         l.append(carrot)         l.append(runner_beans)          competitor_num += 1      return (l) def new_competitor():     open('veggies_2016.txt', 'a') f:         item in competitor_data():             f.write("%s\n" %(item)) def scoreboard_menu():     exit = false      print("which vegetable scoreboard for?")      vegetable = raw_input("please type either cucumber, carrot or runner beans:")      if vegetable == "cucumber":         cucumber_scoreboard()     elif vegetable == "carrot":         carrot_scoreboard()     elif vegetable == "runner beans":         runner_beans_scoreboard()  def cucumber_scoreboard():     exit = true      print("which year scoreboard from?")      scoreboard = raw_input("please type year:")      if scoreboard == "2015":         cucumber_veg_2015()     elif scoreboard == "2014":         cucumber_veg_2014()     elif scoreboard == "2016":         cucumber_veg_2016()   def cucumber_veg_2016(cm):     return float(cm) / 2.54  names = ordereddict([('competitor number', int),                      ('competitor name', str),                      ('cucumber', cucumber_veg_2016),                      ('carrot', float),                      ('runner bean', float)]) data = [] open('veggies_2016.txt') fobj:     while true:         item = {}         try:             name, func in names.items():                 item[name] = func(next(fobj).strip())             data.append(item)         except stopiteration:             break  pprint.pprint(sorted(data, key=itemgetter('cucumber'))[:10]) 

solution

reading data list of dictionaries work:

from collections import ordereddict operator import itemgetter import pprint  def to_inch(cm):     return float(cm) / 2.54  names = ordereddict([('person_number', int),                      ('name', str),                      ('first', to_inch),                      ('second', float),                      ('third', float)]) data = [] open('veggies_2016.txt') fobj:     while true:         item = {}         try:             name, func in names.items():                 item[name] = func(next(fobj).strip())             data.append(item)         except stopiteration:             break  pprint.pprint(sorted(data, key=itemgetter('first'))[:10]) 

output:

[{'first': 4.76771653543307,   'name': 'erma park',   'person_number': 3,   'second': 13.51,   'third': 18.18},  {'first': 5.897637795275591,   'name': 'christal piper',   'person_number': 2,   'second': 11.01,   'third': 21.75},  {'first': 7.893700787401575,   'name': 'dorita griffin',   'person_number': 4,   'second': 10.39,   'third': 21.35},  {'first': 9.653543307086613,   'name': 'carmella henderson',   'person_number': 1,   'second': 13.5,   'third': 21.76}] 

in steps

this helper function converts centimeters inches:

def to_inch(cm):     return float(cm) / 2.54 

we use ordered dictionary hold names different items want read in order. value function use convert read value each item:

names = ordereddict([('person_number', int),                      ('name', str),                      ('first', to_inch),                      ('second', float),                      ('third', float)]) 

we start empty list:

data = [] 

and open our file:

with open('veggies_2016.txt') fobj: 

we without defined end , create new dictionary item each time:

    while true:         item = {} 

we try read file until finished, i.e. until stopiteration exception:

        try:             name, func in names.items():                 item[name] = func(next(fobj).strip())             data.append(item)         except stopiteration:             break 

we go through keys , values of our order dictionary names , call each value, i.e. function func() on next line retrieve next(). converts entry desired datatype , cm-inch conversion first. after reading items 1 person, append dictionary list data.

finally, sort key first , print out 10 entries (my example file has less 10 entries):

pprint.pprint(sorted(data, key=itemgetter('first'))[:10]) 

integration code:

you need put code function podium_place():

def cucumber_veg_2016(cm):     return float(cm) / 2.54  def podium_place():     names = ordereddict([('competitor number', int),                          ('competitor name', str),                          ('cucumber', cucumber_veg_2016),                          ('carrot', float),                          ('runner bean', float)])     data = []     open('veggies_2016.txt') fobj:         while true:             item = ordereddict()             try:                 name, func in names.items():                     item[name] = func(next(fobj).strip())                 data.append(item)             except stopiteration:                 break      sorted_data = sorted(data, key=itemgetter('cucumber'), reverse=true)     entry in sorted_data[:10]:         key, value in entry.items():             print key, value         print  menu() 

at end need call menu(). also, if top mean largest first, need sort reverse (see above).


Comments