Поиск 10 лучших и преобразование их с сантиметров в дюймы – Python

Я читаю данные из файла, как указано ниже, это файл .dat:

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 

Сам файл содержит 50 записей. Из этих данных мне нужен номер человека, имя и первый номер, например:

 1 #person number Marlon Holmes #Name 18.86 # First number 13.02 # Second Number 13.36 # Third Number 

У меня уже есть код для чтения данных, однако я не могу получить 10 лучших результатов, основанных на # первом номере

# Первое число в Топ-10 в настоящее время находится в сантиметрах, но его нужно преобразовать в дюймы, я не уверен, как объединить верхние 10 и преобразование в одно наряду с чтением данных

Код, который считывает данные:

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

Как уже упоминалось, код читает файл, например # # номер телефона, # имя и # первый номер, но # первый номер нужно преобразовать в дюймы, а затем все данные нужно отсортировать, чтобы найти лучшие 10

Этот процесс также должен быть повторен для # второго номера и # третьего номера, однако они являются отдельными с точки зрения их кода от # первого номера

Я попытался прочитать данные, затем добавить в список и отсортировать его и преобразовать из него, но без успеха, любая помощь будет оценена

Весь код:

 from collections import OrderedDict from operator import itemgetter import pprint def menu(): exit = False while not exit: print("To enter new competitior data, type new") print("To view the competition score boards, type Scoreboard") print("To view the Best Overall Growers Scoreboard, type Podium") print("To review this years and previous data, type Data review") print("Type quit to exit the program") choice = raw_input("Which option would you 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 and vegtables lengths""" def competitor_data(): global competitor_num l = [] print("How many competitors would you like to enter?") competitors = raw_input("Number of competitors:") num_competitors = int(competitors) for i 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(): with open('veggies_2016.txt', 'a') as f: for item in competitor_data(): f.write("%s\n" %(item)) def scoreboard_menu(): exit = False print("Which vegetable would you like the 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 would you like the Scoreboard from?") scoreboard = raw_input("Please type a 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 = [] with open('veggies_2016.txt') as fobj: while True: item = {} try: for 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]) 

2 Solutions collect form web for “Поиск 10 лучших и преобразование их с сантиметров в дюймы – Python”

Решение

Чтение данных в список словарей будет работать:

 from collections import OrderedDict from 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 = [] with open('veggies_2016.txt') as fobj: while True: item = {} try: for 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]) 

Вывод:

 [{'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}] 

В шагах

Эта вспомогательная функция преобразует сантиметры в дюймы:

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

Мы используем упорядоченный словарь для хранения имен для разных элементов, которые мы хотим прочитать по порядку. Значение – это функция, которую мы используем для преобразования значения чтения для каждого элемента:

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

Начнем с пустого списка:

 data = [] 

И откройте наш файл:

 with open('veggies_2016.txt') as fobj: 

Мы делаем что-то без определенного конца и каждый раз создаем новый словарь:

  while True: item = {} 

Мы пытаемся прочитать из файла до его завершения, т.е. до тех пор, пока не получим исключение StopIteration :

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

Мы просматриваем ключи и значения наших names словаря заказа и вызываем каждое значение, т. func() Функцию func() на следующей строке, которую мы получаем со next() . Это преобразует запись в нужный тип данных и first выполняет преобразование cm-inch. После прочтения всех предметов для одного человека мы добавим словарь в список.

Наконец, мы first сортируем ключ и распечатываем 10 записей (файл моего примера имеет менее 10 записей):

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

Интеграция с вашим кодом:

Вам нужно поместить код в функцию 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 = [] with open('veggies_2016.txt') as fobj: while True: item = OrderedDict() try: for 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) for entry in sorted_data[:10]: for key, value in entry.items(): print key, value print menu() 

В конце вам нужно вызвать menu() . Кроме того, если верхний средний наибольший первый, вам нужно отсортировать reverse (см. Выше).

Я читал их как запись за раз. Вы можете поместить эту функцию в функцию, которую вы вызываете несколько раз с тем же файлом. Он может вернуть None когда вы достигнете конца файла. Он вернет кортеж со всеми значениями для данной записи (включая конверсии). Затем вы можете sorted сортировку списка записей с использованием любого из значений из каждой записи.

 def read_record(fid): id = fid.readline() # At the end of the file if id is None: return None name = fid.readline() # Perform the conversion number1_inches = float(fid.readline()) / 2.54 number2 = float(fid.readline()) number3 = float(fid.readline()) return (id, name, number1_inches, number2, number3) with open('filename.txt', 'r') as fid: records = list() while True new_record = read_record(fid) # Stop if we hit the end of the file if new_record is None: break records.append(new_record) # Now sort the records based on the value of number1 records = sorted(records, key=lambda x: x[2]) 
  • Запуск сельдерея в колбе: AttributeError: объект «Flask» не имеет атрибута «user_options»
  • Ускорение datetime.strptime
  • Как я могу обновить файл .yml, игнорируя существующий синтаксис Jinja, используя Python?
  • Настройка Python с WSGI на Apache для каталога
  • Преобразование строки Python DateTime в целые миллисекунды
  • tempfile.TemporaryDirectory контекстный менеджер в Python 2.7
  • Как измерять скорость загрузки и прогресс с помощью запросов?
  • Возвратный список загрузчика объекта scrapy
  • Мне нужно точно знать, как использовать string.maketrans
  • Почему этот сценарий печатает посторонние «нет» в выводе
  • Как установить PyCrypto в Windows?
  • Python - лучший язык программирования в мире.