【问题标题】:Sorting list of objects based on attribute, returns memory address instead根据属性对对象列表进行排序,返回内存地址
【发布时间】:2018-10-05 20:27:28
【问题描述】:

我有一个有趣的问题,我完全不明白为什么会这样。因此,我正在尝试根据所述对象中的属性对元组列表进行排序,其中元组的第一个元素是一个对象。因此,我创建了以下代码来测试此功能:

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)]

【问题讨论】:

  • 请修正问题中代码的缩进。缩进严重的 Python 无法运行,并且不是 minimal reproducible example
  • 会的,道歉
  • 你想根据元组中的整数排序???
  • 根据“s”类的对象内部的名称attr进行排序;即按“Fred”和“Bill”排序
  • val 函数放错地方

标签: python list sorting object tuples


【解决方案1】:

你得到了内存地址,因为最后缺少 ()。

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)

输出: 弗雷德 账单 [(比尔,4),(弗雷德,3)] 假的

False 是因为比较检查对象的元组。如果你把它改成list2[0][0] == e2,它会返回True

【讨论】:

  • 所以我需要更改 repr 才能让它工作? sorted() 是否有任何理由将元组中的对象替换为其字符串表示形式? (基本上可以在不改变 repr 的情况下做到这一点吗?)
  • @BenjaminGervin 您添加了 repr,然后将类对象替换为名称。我认为真正的问题是为什么排序返回原始对象而不是原始对象名称,如 e1 和 e2
  • 我会拒绝吗?
  • 我回答说,在前几行中,缺少括号导致了这种情况。
  • 另一个是元组列表,需要__repr__,没有它,表示就像问题中一样。
猜你喜欢
  • 2021-06-27
  • 2022-01-11
  • 2012-11-14
  • 2022-01-05
相关资源
最近更新 更多