你最後一種方法不起作用的原因是你試圖對子列表進行排序。當你這樣做:
L[1:-1].sort(...)
你基本上創建複製子列表L[1:-1]
的。但是,由於您對副本進行了排序,因此沒有提及複製,新的排序列表丟失,隨後進行垃圾回收。
相反,您需要重新分配子列表的新排序值到舊子列表。例如:
>>> l = [1, 3, 2, 4, 5]
>>> l[1:-1].sort() # Reference to sorted sublist is never saved
>>> l # List unchanged
[1, 3, 2, 4, 5]
>>> l[1:-1] = sorted(l[1:-1]) # Reassign the sorted sublist to the old one
>>> l # List is modfied
[1, 2, 3, 4, 5]
下面是有關更多您的具體情況的一個例子:
>>> class UserId:
... def __init__(self, id_number):
... self.id_number = id_number
... def __repr__(self):
... return 'UserId(id_number={})'.format(self.id_number)
...
>>> user_ids = [UserId(1), UserId(3), UserId(4), UserId(2), UserId(5)]
>>> user_ids[1:-1] = sorted(user_ids[1:-1], key=lambda u: u.id_number, reverse=True)
>>> user_ids
[UserId(id_number=1), UserId(id_number=4), UserId(id_number=3), UserId(id_number=2), UserId(id_number=5)]
爲什麼做一個就地排序切片(一種新的,不同的列表)在第二種情況下,用切片分配以更新第一種情況下的列表? –
'someList [i:j] = sorted(somelist [i:j],key = lambda x:x.attr,reverse = True)'爲什麼不行? –
@cᴏʟᴅsᴘᴇᴇᴅ我不知道排序後的()方法鍵是一個參數。如果你讓它成爲答案,我會接受。或者只是刪除,如果它太明顯。 – user3494047