sort()及<__main__.xx at xxx>对象类型排序
anlondon Lv6

最近在研究python2.x的项目时,遇到下面一串代码

1
2
3
4
self.levels.sort(lambda x,y: cmp(x.sequence, y.sequence))
print(self.levels)
#[<__main__.Level object at 0x0000015D7FAF8BA8>, <__main__.Level object at 0x0000015D7FAF84A8>, <__main__.Level object at 0x0000015D7FAF8780>, <__main__.Level object at 0x0000015D7FAF8A58>, <__main__.Level object at 0x0000015D7FAF8C50>, <__main__.Level object at 0x0000015D7FB04550>, <__main__.Level object at 0x0000015D7FAF8C18>, <__main__.Level object at 0x0000015D7FB04AC8>, <__main__.Level object at 0x0000015D7FAF8898>, <__main__.Level object at 0x0000015D7FB04470>, <__main__.Level object at 0x0000015D7FAF8A90>, <__main__.Level object at 0x0000015D7FB042E8>, <__main__.Level object at 0x0000015D7FAF8630>, <__main__.Level object at 0x0000015D7FB0D550>, <__main__.Level object at 0x0000015D7FB1C320>]
# 我不知道对象数据该怎么存,如果直接list = [<__main__xxx]会报错

因为是python2.x的项目加之对对象类型的了解不够,研究了许久才弄明白该怎么改成python3的写法

最终的写法

1
2
3
4
5
6
levels.sort(key=lambda x:id(x), reverse=True)
# key=lambda表示 使用自定义的排序方式
# x:id(x) x表示levels的各个子项,id(x)表示获取子项的十六进制值(因为子项都是对象类型)
# 所以这句函数表示按照各个子项的十六进制值从大到小排序
#或者
sorted(levels, key=lambda x:id(x), reverse=True)

先说python 2到3 的改动

  • sort()如果要使用lambda,则必须添加key=lambda,如果是倒序必须写reverse=True, 而reverse=False 为升序(默认可不写)

  • cmp(x,y) 比较大小函数 ,在python3被弃用

  • x.sequence python3中表示list子项的序列号,但此处的目的应该是要获取对象的值,所以应该使用id(obj)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #python3 
    list=['one','two']
    print( list[0].sequence )
    # 0

    # 对象 a = <__main__.Level object at 0x0000015D7FAF8BA8>
    print(a)
    #<__main__.Level object at 0x0000015D7FAF8BA8>
    print(id(a))
    # 1842045373040
    print( 0x0000015D7FAF8BA8 )
    # 1842045373040

sort()使用lambda参数要注意的

看下面的实例:

1
2
3
4
5
6
7
8
9
10
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]

pairs.sort(key=lambda pair: pair[1])

print(pairs)
# [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

# 其中 pair: pair[1]
# pair 表示pairs的子项(1,'one')....;
# pair[1] 表示pair的第二个参数 ‘four’,‘one’...
 Comments