Python 3 ООП - Как получить имена по первой букве из списка атрибутов (экземпляр объекта) - PullRequest
0 голосов
/ 16 мая 2019

ребята!У меня есть класс ('Student') с 3 атрибутами ('name', 'id', 'gpa').Затем у меня есть список («ученики») предметов этого класса.Мне нужно сохранить в другом списке все экземпляры «студентов» на основе первой буквы («ключ») его списка атрибутов «имя».Таким образом, новый список должен иметь «student.name», «Students.id», «Students.gpa» для каждого «имени», которое начинается с «ключа».

Я пытался studentsNames = filter(lambda x: x.startswith(key), students) Но список ('StudentsNames') появляется пустым, даже если есть имена, начинающиеся с 'key'.

Это пример кода.Полный класс Студент здесь: https://github.com/lelecarabina/python3/blob/master/Student.py и полный код ниже здесь: https://github.com/lelecarabina/python3/blob/master/StudentFinder.py

...

#Create new Student object students
students = [Student((),(),())] * numStudents

print("All Students:")

# Initialize List of Student 'students' with **CONSTRUCTOR** and Print 
for x in range(numStudents): 
    students[x] = (Student(names[x], (1101 + x), (gpas[rand]))) # constructor
    print(students[x].getName(), students[x].getId(), students[x].getGpa())

#prompt user for input
key = input("\nEnter the first letter of student's name: ")

for x in range(len(students)):
    studentsNames = [item for item in students if students[x].name[0] == key]   
    #print(studentsNames)

#print sorted list header
print("Students names starting with '{}'".format(key.upper()))    

#loop through sorted list
for x in range(numStudents): 
    #end loop if no student's names matches user's input
    if studentsNames == "": 
        print("NOT FOUND")
        break
    # end if statement

    #print sorted list is student's name matches user's input, along with name's id and gpa
    for name in studentsNames:  
        if name == students[x].name:
            print("     Name: {} -> ID: {} -> GPA: {}".format(students[x].name, students[x].id, students[x].gpa))

        # end if statement            
    # end for each loop            
# end for loop

#message to user, ending program
print("Program Ended.")

Он должен напечатать: Имя: ... -> ID: ... -> GPA: ... где точки - это информация, полученная от «студентов».Но на нем напечатано: «Имена учеников, начинающиеся с« L », Программа завершена».

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 17 мая 2019

I.Фигурные.Это.Из.Мне нужно было students[x].name[0] == key.upper() вместо просто students[x].name[0] == key, потому что все имена в списке начинаются с заглавных букв ...: (*

Финальный фрагмент кода: `#prompt user для ввода key = input (" \ nВведите первыйбуква имени студента: ")

#look for key in students.name list...
for x in range(len(students)):
    #if key found...
    if students[x].name[0] == key.upper(): 
        #add student record to studentsNames list...
        studentsNames.append(students[x].name)               

#loop through sorted list
print("Students names starting with '{}'".format(key.upper()))
for x in range(numStudents): 
    #end loop if no student's names matches key
    if studentsNames == "": 
        print("NOT FOUND")
        break
    # end if statement

    #print student records that matched key
    for name in studentsNames:  
        if name == students[x].name:
            print("     Name: {} -> ID: {} -> GPA: {}".format(students[x].name, students[x].id, students[x].gpa))    
        # end if statement            
    # end for each loop            
# end for loop`
...