Python: вызов функции со строкой возвращает описание аргумента

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

Моя функция определяется как сортировка (атрибут), и когда я вызываю ее, например: 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)

Что содержит дюрлист?

CristiFati 18.05.2019 22:31

Какой тип данных для djurlista?

Akhil Batra 18.05.2019 22:31

Тип данных — строки

Lajen 18.05.2019 23:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте 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» не подлежит подписке.

Lajen 18.05.2019 23:18

Похоже, вы пытаетесь получить параметр .attribut из глобального класса/объекта с именем x (через x.attribut), который должен вызывать ошибку, если он не существует, но может не быть, если он хранится в вашем python cli как-то.

Если убрать х. перед ссылкой на атрибут вы все еще получаете ту же ошибку?

Если я это сделаю, то sort() не сделает то, что должно

Lajen 18.05.2019 23:20

Извините, полностью пропустил лямбда-выражение. Не могли бы вы поделиться типом данных / определением дюрлиста в исходном сообщении?

mochsner 19.05.2019 03:46

Это список строк

Lajen 19.05.2019 09:25

Спасибо! Должен был понять, что вы имеете дело с атрибутами объектов из имени... извините. На данный момент похоже, что CristiFati уже ответили правильно :) Удачи!

mochsner 20.05.2019 01:18
Ответ принят как подходящий

Вместо x.attribut (где атрибут — строка, а Икс — экземпляр Джур) следует использовать [Python 3.Docs]: Встроенные функции — getattr(объект, имя[, по умолчанию]):

djurlista.sort(key=lambda x: getattr(x, attribut))

Другие вопросы по теме