根据属性对对象列表进行排序,而不是

时间:2018-04-25 11:18:30

标签: python list sorting object tuples

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

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 :(得分:0)

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

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