2014-10-28 59 views
-1

我有一個Python中的字典列表,像這樣;如何根據其內容對Python中的列表重新排序

l = [{'name': 'John', 'age': 23}, 
    {'name': 'Steve', 'age': 35}, 
    {'name': 'Helen'}, 
    {'name': 'George'}, 
    {'name': 'Jessica', 'age': 23}] 

我想在這裏實現的是重新排序的l元素中含有的關鍵age移動到列表這樣的結尾每個條目的方式;

最終結果:

l = [{'name': 'Helen'}, 
    {'name': 'George'}, 
    {'name': 'Jessica', 'age': 23}, 
    {'name': 'John', 'age': 23}, 
    {'name': 'Steve', 'age': 35}] 

我應該怎麼辦呢?

+0

如果dict有一個年齡,你也要按年齡排序? – wnnmaw 2014-10-28 12:46:26

+2

您的示例輸出*也*按年齡排序。那是故意的嗎? – 2014-10-28 12:48:50

+0

@MartijnPieters不,它不是。純粹的隨機性在這裏。我目前對年齡的訂購不感興趣,因此您的答案綽綽有餘。謝謝。 – kstratis 2014-10-28 12:54:20

回答

3

您可以對列表進行排序:

l.sort(key=lambda d: 'age' in d) 

鍵返回要麼TrueFalse的基礎上,'age'鍵的存在; True排序方式爲False。 Python的排序是穩定的,相對排序的其餘部分保持不變。

演示:

>>> from pprint import pprint 
>>> l = [{'name': 'John', 'age': 23}, 
...  {'name': 'Steve', 'age': 35}, 
...  {'name': 'Helen'}, 
...  {'name': 'George'}, 
...  {'name': 'Jessica', 'age': 23}] 
>>> l.sort(key=lambda d: 'age' in d) 
>>> pprint(l) 
[{'name': 'Helen'}, 
{'name': 'George'}, 
{'age': 23, 'name': 'John'}, 
{'age': 35, 'name': 'Steve'}, 
{'age': 23, 'name': 'Jessica'}] 

如果想按年齡排序,然後檢索年齡值並返回沒有年齡的那些條目合適穩定的前哨,但將進行排序第一。 float('-inf')總是在任何其他數量進行排序,例如:

l.sort(key=lambda d: d.get('age', float('-inf'))) 

同樣,沒有年齡的條目被留在原來的相對順序:

>>> l.sort(key=lambda d: d.get('age', float('-inf'))) 
>>> pprint(l) 
[{'name': 'Helen'}, 
{'name': 'George'}, 
{'age': 23, 'name': 'John'}, 
{'age': 23, 'name': 'Jessica'}, 
{'age': 35, 'name': 'Steve'}] 
+0

建議使用'l.sort(key = lambda d:d.get('age',-1))',因爲它也會按年齡排序 – stalk 2014-10-28 12:47:58

+0

@stalk:我還不確定這是否是意圖,但我會擴大。 – 2014-10-28 12:49:05

相關問題