Как я могу использовать функцию, чтобы упорядочить различные атрибуты объекта - PullRequest
1 голос
/ 10 мая 2019

У меня есть класс. Скажем, у класса есть следующие атрибуты: возраст, рост, вес, IQ.

Я хочу напечатать 5 лучших экземпляров этого объекта во всех категориях. Например, 5 самых старых, 5 самых умных, 5 самых высоких.

Я хотел бы использовать 1 функцию, которую я мог бы вызвать 4 различными способами, чтобы сделать это.

Например:

def topNOfAttribute(people,attr,num=5):
    people.sort(key=lambda x:x.attr,reverse=True)
    toDisplay=[x for x in people if x.attr>=people[num-1].attr]
    print toDisplay

Теоретически, я мог бы назвать это так topNOfAttribute (люди, 'возраст') topNOfAttribute (люди, 'высота')

Вместо создания 4 функций: 1 для возраста, 1 для роста и т. Д.

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Использование 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')

Я также упростил способ получения top-n с помощью нарезки.Как правило, не хорошо изменять ваши аргументы в функции.Создайте копию списка с помощью sorted

0 голосов
/ 10 мая 2019

Используя 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}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...