我有这个:
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
作为一个字符串来试试......
AttributeError: "Student instance has no attribute 'sortby'"
我知道没有属性sortby
,这应该是一个参数...但它不能使用这样的参数?为什么不?我该怎么做呢?
答案 0 :(得分:4)
Python实际上正在寻找名为' sortby'这当然不会存在。使用getattr builtin使用字符串而不是标识符从对象中获取属性。
def sort(sortlist, sortby):
sortlist.sort(key = lambda x: getattr(x, sortby))
答案 1 :(得分:0)
您还可以使用attrgetter
模块中的operator
:
from operator import attrgetter
def sort(sortlist, sortby):
sortlist.sort(key=attrgetter(sortby))