0

我有这个:

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对象。然后我可以打印这样的名称列表:

for item in Students:
    print item.FirstName, item.LastName

它乖乖地输出了这个:

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了一个字符串来试试……</p>

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

我知道没有属性sortby,这应该是一个参数......但它不能使用这样的参数?为什么不?我怎样才能让它做到这一点?

4

2 回答 2

4

Python 实际上正在寻找一个名为 'sortby' 的属性,它当然不存在。使用 getattr 内置函数使用字符串而不是标识符从对象中获取属性。

def sort(sortlist, sortby):
    sortlist.sort(key = lambda x: getattr(x, sortby))
于 2013-06-14T17:37:02.447 回答
0

您还可以attrgetteroperator模块中使用:

from operator import attrgetter
def sort(sortlist, sortby):
    sortlist.sort(key=attrgetter(sortby))
于 2013-06-14T18:33:57.120 回答