Сортировка списка объектов на основе атрибута, вместо этого возвращает адрес памяти - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть интересный вопрос, который я вообще не понимаю, почему это происходит.Итак, я пытаюсь отсортировать список кортежей, где первый элемент кортежа является объектом, на основе атрибутов в указанных объектах.Итак, я создал следующий код для проверки этой функциональности:

class s(object):
    def __init__(self, name):
        self._name = name
    def get_name(self):
        return self._name

def val(x):
    #This used in place of a lambda
    return x[0]._name

e1 = s("Fred")
e2 = s("Bill")
print(e2.get_name())

list1 = [(e1, 3), (e2, 4)]

for n in list1:
    print(val(n))

list2 = sorted(list1, key = val)

print(list2)

print(list2[0] == e2)

print(e2.get_name)
print(e2._name)

С выводом этого:

Bill
Fred
Bill
[(<__main__.s object at 0x0000002AC47D6438>, 4), (<__main__.s object at 0x0000002AC47D6240>, 3)]
False
<bound method s.get_name of <__main__.s object at 0x0000002AC47D6438>>
Bill

Я понятия не имею, почему я получаю памятьадреса атрибутов как первые элементы моих кортежей после сортировки, и я просмотрел SO, и с этим кодом действительно не должно быть проблем, поскольку он выглядит точно так же, как и многие другие посты по этому вопросу.Кто-нибудь может помочь мне здесь и указать, почему это происходит?Я ожидаю этот вывод:

print(list2) #After sorting
OUTPUT:
[(e2, 4), (e1, 3)]

1 Ответ

0 голосов
/ 25 апреля 2018

Вы получили адрес памяти, потому что () отсутствует в конце.

print(e2.get_name) -> <bound method s.get_name of ...
print(e2.get_name()) -> Bill

Другой q:

class s(object):
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return str(self._name)

    def __repr__(self):
        return str(self._name)

 def val(x):
     #This used in place of a lambda
     return x[0]._name.lower()

 e1 = s("Fred")
 e2 = s("Bill")
 list1 = [(e1, 3), (e2, 4)]

 for n in list1:
     print(val(n))

 list2 = sorted(list1, key = val)

 print(list2[0] == e2)

Out: Фред Билл [(Билл, 4), (Фред, 3)] Ложь

The Falseпотому что сравнить проверить кортеж для объекта.Если вы измените его на list2[0][0] == e2, он вернет True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...