2013-06-14 5 views
0

У меня есть это:Попытка передать параметры как функции в Python

class Student: 
    def __init__(self, FirstName, LastName): 
     self.FirstName = FirstName 
     self.LastName = LastName 

    def __iter__(self):            
     return self 

Students = [ 
#  FirstName LastName 
Student("Mary",  "Smith"), 
Student("Joe",  "Jones"),  
Student("Jane",  "Doe" )] 

Я делаю Student класс. И затем я делаю список из 3 Student объектов. Тогда я могу напечатать список имен, как это:

И послушно выдает это:

Mary Smith 
Joe Jones 
Jane Doe 

Тогда я гугл, как отсортировать список объектов по атрибуту и ​​нашел это:

Students.sort(key = lambda x: x.LastName) 

И это работает. Эта линия сортировки списка с помощью атрибута LastName и я могу напечатать его таким же образом, как описано выше, и имена в порядке LastName:

Jane Doe 
Joe Jones 
Mary Smith 

Но то, что я хочу, чтобы это произошло, это есть входы пользователей для того, что список для сортировки (sortlist) и по которому атрибут сортируется по (sortby). Поэтому я пробовал:

def sort(sortlist, sortby): 
    sortlist.sort(key = lambda x: x.sortby) 

sort(Students, FirstName) 

И это не работает. Сначала он говорит:

NameError: "name 'FirstName' is not defined" 

Что это собственная проблема ... Как я могу сказать, что это FirstName является атрибутом списка Я хочу его отсортировать?

Тогда я сделал FirstName строку просто попробовать, что ...

AttributeError: "Student instance has no attribute 'sortby'" 

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

ответ

4

Python на самом деле ищет атрибут «sortby», который, конечно, не существовал бы. Используйте getattr builtin для извлечения атрибута из объекта с помощью строки вместо идентификатора.

def sort(sortlist, sortby): 
    sortlist.sort(key = lambda x: getattr(x, sortby)) 
+0

Спасибо, что работает! – user2438690

0

Вы также можете использовать attrgetter из operator модуля:

from operator import attrgetter 
def sort(sortlist, sortby): 
    sortlist.sort(key=attrgetter(sortby)) 
Смежные вопросы