Я пытаюсь вызвать функцию со строкой, но при этом функция просто использует имя аргумента для этой функции.
Моя функция определяется как сортировка (атрибут), и когда я вызываю ее, например: sortering («возраст»), она использует «атрибут», а не «возраст».
Вот код, я новичок в python, поэтому, вероятно, это что-то очевидное, с чем я не знаком.
def sortering(attribut):
try:
val1 = input("Vill du sortera stigande eller fallande? s/f")
if val1 == "s":
djurlista.sort(key=lambda x: x.attribut)
print(*djurlista,sep='\n' + ' ' + '\n')
elif val1 == "f":
djurlista.sort(key=lambda x: x.attribut, reverse=True)
print(*djurlista,sep='\n' + ' ' + '\n')
except ValueError:
print("Svara med s för stigande eller f för fallande!")
sortering('age')
Список «djurlista» представляет собой список строк, и каждая строка представляет собой объект «Djur» с атрибутами: art, namn, ålder, kön, gravid.
Вот этот код:
class Djur:
def __init__(self, art, namn, ålder, kön, gravid):
self.art = art
self.namn = namn
self.age = ålder
self.gender = kön
self.gravid = gravid
x = Djur(art, namn, ålder, kön, gravid)
self.djurlista.append(x)
def __str__(self):
return ("Art: " + str(self.art) + " " + "\n"
"Namn: " + str(self.namn) + " " + "\n"
"Ålder: " + str(self.age) + " " + "\n"
"Kön: " + str(self.gender) + " " + "\n"
"Gravid: " + str(self.gravid))
def __repr__(self):
return str(self)
Какой тип данных для djurlista?
Тип данных — строки






Используйте x[attribut], а не x.attribut
def sortering(attribut):
try:
val1 = input("Vill du sortera stigande eller fallande? s/f")
if val1 == "s":
djurlista.sort(key=lambda x: x[attribut])
print(*djurlista,sep='\n' + ' ' + '\n')
elif val1 == "f":
djurlista.sort(key=lambda x: x[attribut], reverse=True)
print(*djurlista,sep='\n' + ' ' + '\n')
except ValueError:
print("Svara med s för stigande eller f för fallande!")
sortering('age')
Если я это сделаю, я получу следующую ошибку: TypeError: объект «Djur» не подлежит подписке.
Похоже, вы пытаетесь получить параметр .attribut из глобального класса/объекта с именем x (через x.attribut), который должен вызывать ошибку, если он не существует, но может не быть, если он хранится в вашем python cli как-то.
Если убрать х. перед ссылкой на атрибут вы все еще получаете ту же ошибку?
Если я это сделаю, то sort() не сделает то, что должно
Извините, полностью пропустил лямбда-выражение. Не могли бы вы поделиться типом данных / определением дюрлиста в исходном сообщении?
Это список строк
Спасибо! Должен был понять, что вы имеете дело с атрибутами объектов из имени... извините. На данный момент похоже, что CristiFati уже ответили правильно :) Удачи!
Вместо x.attribut (где атрибут — строка, а Икс — экземпляр Джур) следует использовать [Python 3.Docs]: Встроенные функции — getattr(объект, имя[, по умолчанию]):
djurlista.sort(key=lambda x: getattr(x, attribut))
Что содержит дюрлист?