2016-04-16 5 views
0

Я пытаюсь отсортировать некоторые данные, которые я вытащил из файла, в алфавитном порядке (рабочий), усредняющий данные (добавляя все данные, игнорируя буквы, и усреднение всего) и, наконец, сортировка баллов от наивысшего до самого низкого (сначала введите имя пользователя, еще не завершенное). Пожалуйста, помогите, вот он код:Сортировка данных по среднему, наивысшему и наименьшему из текстового файла

(ВФ устанавливается как-то посмотреть через файл)

sort = input("What would you like to do with this class? Put them into alpabetical order(a)? Average the scores(b)? Highest to lowest(c)?") 

with open(wf, 'r') as r: 

    if sort == 'a': 
     for line in sorted(r): 
      print(line, end = '') 

    elif sort == 'b': 
     for line in sorted(r): 
      print() 

    elif sort == 'c': 
     def score(line): 
      return int(line.split(',')[1]) 
     with open(wf, 'r') as r: 
      list.sort(r) 
      for line in sorted(r,reverse=True): 
       print(line) 
+2

Можете ли вы отредактировать вопрос, чтобы показать образец данных в файл? – paisanco

+0

Почему бы не импортировать текстовый файл в pandas, пакет анализа данных Python, который может сортировать и запускать агрегаты, подобные средним? – Parfait

ответ

1

Решая для среднего:

Чтобы получить среднее, что нужно, чтобы добавить все результаты вместе, затем разделите его на количество баллов. Вы можете сделать это перебором строк и суммирования всех баллов, а затем разделить на количество линий

Сортировка по баллам:

Вам нужно вызвать функцию сортировки() и предоставить свой собственный ключ. У вас была функция, которая почти делала это, я только немного ее исправил. Вы отправляете ему список строк и ваш ключ, который возвращает результат, а затем отменяет его, так как вы хотите, чтобы они были самыми высокими до самых низких. Тогда это просто вопрос перекручивания через новый отсортированный список и печать каждую линию

Общих Комментариев

Структуры этой программы является очень неаккуратно и излишней. Вы должны просто прочитать файл один раз, а затем все выяснить. Итерация через файл внутри каждого оператора if выполняется медленно. Вы также должны использовать функции для этого. Создайте функцию, которая возвращает среднее значение, функцию, возвращающую список, упорядоченный по счету и т. Д. Оставляя код, все скремблированные в основном просто затрудняют чтение

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

sort = input("What would you like to do with this class? Put them into alpabetical order(a)? Average the scores(b)? Highest to lowest(c)?") 
wf = "file.txt" 

with open(wf, 'r') as r: 
    if sort == 'a': 
     for line in sorted(r): 
      print(line, end = '') 

    elif sort == 'b': 
     totalScore = 0 
     numOfScores = 0 
     for line in sorted(r): 
      numOfScores += 1 
      totalScore+= int(line.split('score = ')[1]) 
     average = totalScore/numOfScores 
     print(average) 


    elif sort == 'c': 
     def score(line): 
      return int(line.split('=')[1]) 
     with open(wf, 'r') as r: 
      linesList = r.readlines() 
      sortedList = sorted(linesList, key=score) 
      for line in sortedList: 
       print(line.rstrip("\n")) 

для этого примера я использовал подать вашу представленные примеры оценки, как, например:

bob - score = 12 
harry - score = 1 
ellis - score = 21 
sam - score = 30 
+0

Хороший ответ. Две вещи, хотя при определении numOfScores - это не len (r), просто реагент? И в line.split Не предполагается ли это [-1] как индекс? –

+0

len (r) дает 'TypeError: объект типа '_io.TextIOWrapper' не имеет len()', и индекс должен быть [1], потому что оценка - это то, что после знака =. Разделение выглядит как «[» bob-score = "," 12 "]' – Keatinge

+0

Я имел в виду в elif 'b', тогда вам не понадобится аргумент в split. Ну, len (отсортированный (r)) должен работать. –