Изменение ключа сортировки без использования каких-либо атрибутов вне классаPython

Программы на Python
Ответить
Anonymous
 Изменение ключа сортировки без использования каких-либо атрибутов вне класса

Сообщение Anonymous »


Я пытаюсь реализовать сортировку слиянием с использованием класса «Person», однако я не могу использовать какие-либо атрибуты «Person» вне этого класса. Я хочу изменить ключевой аргумент функции «mergesort» на основе значения sort_key в функции «create_persons_list» — для этого я использую лямбда-функцию. Я создаю кортеж в person_objects с именем, возрастом, ростом и весом. Таким образом, если я хочу отсортировать список по именам, установите ключ сортировки на индекс 0 кортежа.

импортировать numpy как np #import load_names импортировать перечисление из merge_sort импортировать сортировку слиянием # NAMES — это список или массив с общими именами. NAMES = ["Алиса", "Боб", "Чарли", "Дэвид", "Ева", "Фрэнк", "Грейс", "Хэнк", "Айви", "Джек"] # Переменные в глобальном пространстве имен должны быть капитализированным. класс Человек(): def __init__(я, имя, возраст, рост, вес): self._name = имя self._age = возраст self._height = высота self._weight = вес защита __len__(сам): вернуть len(self.data) защита __repr__(сам): return f"{self._name}, {self._age} лет, {self._height} см, {self._weight} кг\n" def __eq__(сам, другое): return (self._age, self._height, self._weight) == (other._age, Other._height, Other._weight) def __lt__(я, другой): return (self._age, self._height, self._weight) < (other._age, Other._height, Other._weight) def __le__(я, другой): return (self._age, self._height, self._weight) (other._age, Other._height, Other._weight) def __ge__(я, другой): return (self._age, self._height, self._weight) >= (other._age, Other._height, Other._weight) защита __int__(сам): вернуть int(self._age) защита __float__(сам): вернуть float(self._age) защита __str__(сам): return f"{self._name}, {self._age} лет, {self._height} см, {self._weight} кг" def create_persons_list(n=10, sort_key='weight'): person_objects = [(Person(np.random.choice(NAMES), np.random.randint(18, 101), np.random.randint(150, 201), np.random.randint(45, 101))) для _ в диапазоне(n)] #print("po: ",person_objects[0]) если sort_key == 'имя': return mergesort(person_objects, key=lambda x: x[0]) elif sort_key == 'возраст': return mergesort(person_objects, key=lambda x: x[1]) elif sort_key == 'высота': return mergesort(person_objects, key=lambda x: x[2]) elif sort_key == 'вес': return mergesort(person_objects, key=lambda x: x[3]) еще: поднять ValueError("Неверный ключ сортировки. Поддерживаемые значения: "имя", "возраст", "рост" и "вес".") sorted_persons_by_name = create_persons_list(sort_key='name') sorted_persons_by_age = create_persons_list(sort_key='возраст') sorted_persons_by_height = create_persons_list(sort_key='height') sorted_persons_by_weight = create_persons_list(sort_key='weight') print("Сортировка по имени: \n") печать(сортированные_персоны_по_имени) print("Сортировка по возрасту: \n") печать(сортированные_персоны_по_возрасту) print("Сортировка по высоте: \n") печать(сортированные_персоны_по_высоте) print("Сортировка по весу: \n") print(sorted_persons_by_weight) #print(create_persons_list()) Если я выполню его, я получу ошибку TypeError, что этот объект «Человек» не подлежит субкриптографии. Можно ли реализовать мою идею без использования каких-либо атрибутов вне класса Person?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»