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
Post a Comment