如何重用函数来排序对象的不同属性

时间:2019-05-09 22:04:15

标签: python list oop

我上课。我们将说该类具有以下属性:年龄,身高,体重,智商。

我想在所有类别中打印此对象的前5个实例。例如,最老的5个,最聪明的5个,最高的5个。

我想使用1个可以通过4种不同方式调用的函数来完成此操作。

例如:

display:none

理论上,我可以这样称呼它 topNOfAttribute(people,'age') topNOfAttribute(people,'height')

而不是创建4个功能,年龄是1个,身高是1个,等等。

2 个答案:

答案 0 :(得分:2)

使用getattr

def topNOfAttribute(people, attr_name, num=5):
    sorted_people = sorted(people, key=lambda x: getattr(x, attr_name), reverse=True)
    toDisplay = sorted_people[:num]
    print toDisplay

用法:

topNOfAttribute(people, 'age')

我还简化了使用切片获得前n位的方式。在函数中更改参数通常不好。因此,请在sorted

中创建列表的副本

答案 1 :(得分:0)

使用getattr,可以轻松地将其变成单线。

代码(Python 3.5)

from pprint import pprint

class Student(object):
    def __init__(self, age, height, weight, iq):
        self.age = age
        self.height = height
        self.weight = weight
        self.iq = iq

    def __repr__(self):
        return str({'age': self.age, 'height': self.height, 'weight': self.weight, 'iq': self.iq})

def top(objects, attr, num=5):
    return sorted(objects, key=lambda x: getattr(x, attr), reverse=True)[:num]

students = [
    Student(age=21, height=127, weight=168, iq=120),
    Student(age=24, height=120, weight=120, iq=50),
    Student(age=19, height=110, weight=400, iq=90),
    Student(age=30, height=190, weight=30, iq=92),
    Student(age=31, height=180, weight=168, iq=77),
    Student(age=42, height=169, weight=168, iq=98)
]

pprint(top(students, 'iq'))

结果

[{'age': 21, 'iq': 120, 'weight': 168, 'height': 127},
 {'age': 42, 'iq': 98, 'weight': 168, 'height': 169},
 {'age': 30, 'iq': 92, 'weight': 30, 'height': 190},
 {'age': 19, 'iq': 90, 'weight': 400, 'height': 110},
 {'age': 31, 'iq': 77, 'weight': 168, 'height': 180}]