尝试在Python中将参数作为函数传递

时间:2013-06-14 17:32:13

标签: python function sorting parameters

我有这个:

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,这应该是一个参数...但它不能使用这样的参数?为什么不?我该怎么做呢?

2 个答案:

答案 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))