2014-09-28 2 views
0

У меня есть следующий текстовый файл (results.txt), который в настоящее время созданы так:Выбрать и сортировать целые числа/строки из текстового файла в Python

Sophie 
3 
6 
9 
Laura 
8 
5 
15 
Alan 
10 
4 
6 

Я пытаюсь выбрать и сортировать эти данные по-разному. До сих пор мой код выглядит следующим образом:

file = open('Results.txt', 'r') 
lines = file.read().splitlines() 
a = int(lines[1]) 
b = int(lines[2]) 
c = int(lines[3]) 
d = int(lines[5]) 
e = int(lines[6]) 
f = int(lines[7]) 
g = int(lines[9]) 
h = int(lines[10]) 
i = int(lines[11]) 
name1=lines[0] 
name2=lines[4] 
name3=lines[8] 
allnames=[name1, name2, name3] 
allnames.sort() 
student1 = [a,b,c] 
student2 = [d,e,f] 
student3 = [g,h,i] 
s1high=max(student1) 
s2high=max(student2) 
s3high=max(student3) 

file.close() 

Я хотел бы моя программа, чтобы иметь возможность:

  • Сортировать результаты тестирования по алфавиту и показать студентам высокий балл.
  • Сортировать по среднему баллу, наивысшему наименьшему.
  • Сортировать по наивысшей оценке, самой высокой и самой низкой.

... и выход этого на экран

Как вы можете видеть, я начал импортировать результаты из текстового файла и преобразовать их в целые числа, но, безусловно, должен быть некоторым быстрым способом сделай это?

ответ

1

Смотрите, если это то, что вы хотите

Для чтения содержимого из файла, который вы можете использовать

s = {lines[i]:[float(k) for k in lines[i+1:i+4]] for i in range(0,len(lines),4)} 

Это дает словарь студентов против отметок что-то вроде этого

s = {'Laura': [8, 5, 15], 'Sophie': [3, 6, 9], 'Alan': [10, 4, 6]} 

Для сортировки по алфавитам Вы можете использовать

for i in sorted(s.keys()): 
    print i,max(s[i]) 

аналогичны для сортировки по среднему

# function which returns avg mark given the name 
avg_mark = lambda name:sum(s[name])/len(s[name]) 
for i in sorted(s.keys(),key=avg_mark,reverse=True): 
    print i,avg_mark(i) 

аналогична для сортировки в соответствии с самым высоких отметками

# function which returns highest mark given the name 
high_mark = lambda name:max(s[name]) 
for i in sorted(s.keys(),key=high_mark,reverse=True): 
    print i,high_mark(i) 

Надеется, что это помочь тебе. Не стесняйтесь комментировать, если вам нужно объяснение для чего

+0

@ jif86 Это работало? –

+0

Спасибо за ваш ответ. Я попытался добавить код dict и сортировку в соответствии с кодом алфавитов, но моя программа ничего не выводит. Я делаю что-то неправильно? Спасибо за вашу помощь. – jif86

+0

Есть ли у вас какие-либо ошибки? –

1

Я не уверен, что вы имели в виду, говоря «... и показать студентам высокий балл Сортировать по среднему баллу, по убыванию Сортировать по наибольшему количеству баллов, от высшего к низшему ...»

Может быть этот маленький код поможет вам начать то, что вы хотите сделать.

file = open('Results.txt', 'r') 
lines = file.read().splitlines() 
my_dict = {} 
key = None 

# creating a dict with your data 
for line in lines: 
    if line.isalpha(): 
     key = line 
     my_dict[key] = [] 
    else: 
     my_dict[key].append(int(line)) 

# printing your data 
# iterating on sorted by key dict 
for student in sorted(my_dict): 
    print(student) 
    # iterating the sorted list 
    for score in sorted(my_dict[student], reverse=True): 
     print(score) 
+0

Число в текстовом файле, относится к баллу по результатам испытаний Студента.Есть три человека. – jif86

+0

Я понимаю, что первый цикл for определяет между текстом и целыми числами и соответственно добавляет их в dict, но как насчет второго? Я не могу понять, как программа определяет, что такое студент, и что такое оценка? – jif86

+0

Я добавил несколько комментариев к коду. первый цикл for (во второй части) сортирует имена студентов (ключи). второй для цикла сортирует список оценок, по убыванию, каждого ученика –

0

Возможно, что-то вроде этого? Работает на CPython 2. [67], CPython 3. [], PyPy 2.4.0, Pypy3 2.3.1 и Jython 2.7b3:

#!/usr/local/cpython-3.4/bin/python 

# pylint: disable=superfluous-parens 
# superfluous-parens: Parentheses are good for clarity and portability 

'''Get student grades''' 

# port pprint 
import decimal 
import collections 


def main(): 
    '''Main function''' 
    students = collections.defaultdict(list) 
    with open('input', 'r') as file_: 
     for line in file_: 
      line_sans_newline = line.rstrip('\n') 
      if line_sans_newline.isalpha(): 
       name = line_sans_newline 
      else: 
       students[name].append(decimal.Decimal(line)) 
    names = list(students) 
    names.sort() 
    for name in names: 
     max_grade = max(students[name]) 
     print('{0} {1}'.format(name, max_grade)) 

main() 

НТН

0
val=[] 
keys=[] 
i=0 
l=[] 
lines=open('Result.txt','r').readlines() 
for line in lines: 
    try: 
    val.append(int(line)) 
    except: 
    keys.append(line) 

for i in range(0,len(val),3): 
h=val[i:i+3] 
h.sort() 
l.append(h[::-1]) 
print 'Sort the test results alphabetically and show the students highest score.\n' 
for i,j in zip(keys,l): 
    print i,j 

print 'Sort by the average score, highest to lowest.' 
avlist=[float(sum(i))/len(i) for i in l ] 
print avlist 
while(len(avlist)): 
    for i,j in zip(keys,avlist): 
     if j==max(avlist): 
      print i,j 
      avlist.remove(j) 

print '\nSort by the highest score, highest to lowest.\n' 
hlist=[max(i) for i in l ] 
hlist.sort() 
hlist=hlist[::-1] 
for k in hlist: 
    for i,j in zip(keys,l): 
     if max(j)==k: 
      print i,j 

Результат:

Sort the test results alphabetically and show the students highest score. 

Sophie 
[9, 6, 3] 
Laura 
[15, 8, 5] 
Alan 
[10, 6, 4] 

Sort by the average score, highest to lowest. 

[6.0, 9.333333333333334, 6.666666666666667] 
Laura 
9.33333333333 
Alan 
6.66666666667 
Sophie 
6.0 

Sort by the highest score, highest to lowest. 

Laura 
[15,8,5] 
Alan 
[10,6,4] 
Sophie 
[9,6,3] 
Смежные вопросы