2015-05-28 6 views
1

Я создаю программу оценки учеников: она начинается в режиме ввода и запрашивает имя, возраст, научную оценку, математику и класс английского языка.
Тогда есть несколько возможных действий: добавьте учеников, добавьте школьные классы, распечатайте каждого добавленного студента и - распечатайте самые низкие результаты по самым высоким результатам в разных предметах. Это последнее действие - это то, с чем я столкнулся.Как отсортировать список строк и список чисел, связанных, в python?

В чем я вхожу, когда пользователь вводит «4» в главное меню, пользователь спрашивает, хочет ли он отображать результаты математики, физики или английского языка студентов. Когда пользователь указывает, что они хотят, чтобы отобразить, будет произведено что-то вроде следующего:

Jill: 3 
Marvin: 4 
Jack: 6 
Raf: 80 

Я знаю, как сортировать по номерам с функцией сортировки(), но как я делаю «Джил» идти в то же место, что и «3» в списке.

Это так что я могу сделать что-то вроде этого:

for p in range(len(allStudents)): 
    print(allStudents[p].printName(), ":" , mathsAll[p] , "/100") 

Я знаю, что я мог бы использовать словарь для этого, но тогда давайте говорить вход I 2 пользователей называется «Jill», то он будет перезаписывать первый один.

полный код можно найти по адресу: http://pastebin.com/R2uGAQVg Любая помощь была бы принята с благодарностью!

+0

Определенно вам нужно предоставить образец ввода и вывода. –

+0

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

+0

Я сделаю программу более простой. Просто притворись, что есть меню, которое может получать только 2 входа, если пользователь вводит 1, тогда пользователю будет предложено ввести: Там научный класс, их математический класс и их английский класс и имя ученика.Если пользователь вводит 4, он будет предлагать пользователю ввести либо 1) математику 2) науку 3) английский. Если пользователь вводит 1, тогда он отобразит всех студентов, все математические результаты которых будут получены от самого низкого до самого высокого. Я не могу просто создать dict, потому что, если я вводим одно и то же имя дважды, он будет перезаписан. Итак, как вы создаете dict, который не перезаписывается. – mre12345

ответ

1

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

data = [('Jill', 3), ('Marvin', 4), ('Jack', 6), ('Raf', 80)] 

for datum in data: 
    name, score = data 
    # do whatever you like.... 

Или используйте список словарей

data = [{'name': 'Jill', 'score': '3'}, ... ] 

for d in data: 
    print(d['name'] + ": " + d['score']) 

Или использовать namedtuple с.

from collections import namedtuple 

Student = namedtuple('Student', ['name', 'score']) 

data = [Student(name="Jill", score=3), ... ] 

for student in data: 
    print(data.name + ": " + data.score) 
    # or print("{student.name}: {student.score}".format(student=student)) 

Или любой из ряда других лучше способов обработки данных, чем два несвязанных списков !!

+0

Спасибо за ответ !, причина, по которой я не могу использовать словари, заключается в том, что я пользователь, который вводит имя студента, поэтому, если они набирают одно имя, он будет переопределяться. В чем разница между кортежем и словарем и переопределяется ли он, если ключ указан дважды, как словари? – mre12345

+0

Если имена первых учеников не могут служить уникальными идентификаторами, я бы рекомендовал использовать их идентификатор студента в качестве ключа или, может быть, их первую начальную и фамилию (например, 'jdoe'). – TigerhawkT3

+1

@ mre12345 вам нужно подумать более конкретно. Словари не перезаписываются, если у них более одного * имени *, они перезаписываются дублирующимися * ключами *. Таким образом, вы не можете использовать ничего не уникального для ключа, но вы все равно можете хранить данные в словаре. Смотрите мои примеры. –

1

Вы можете хранить студентов в классе:

class Student: 
    def __init__(self, name, math_grade): 
     self.name = name 
     self.math_grade = math_grade 

тогда, если у вас есть список студентов student_list, вы можете отсортировать список по атрибуту:

student_list = [Student("Steve", 3), Student("Paul", 4), Student("Jack, 5")] 
student_list.sort(key=lambda x: x.math_grade, reverse=True) 
print(student_list) 

Тогда, если у студентов есть больше атрибутов (возраст, имя, научный класс, английский класс и т. д.), легко сортировать их, изменяя лямбда.

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

Смежные вопросы