2014-01-26 53 views
8

我有一個列表:特定的排序由點分隔的數字列表

L = ['1.1.1.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.', '1.1.2.', '1.1.3.', '1.1.4.'] 

我想它在接下來的順序進行排序:

1.1.1. 
1.1.2. 
1.1.3. 
1.1.4. 
1.1.10. 
1.1.11. 
1.1.12. 
1.1.13. 

下面的方法不會產生一個結果:

L.sort(key=lambda s: int(re.search(r'.(\d+)',s).group(1))) 
+0

你的問題與Django無關,真的。 –

+1

當列表中有一個「1.2.1」值時會發生什麼?如果有'2.1.1'會怎麼樣?應該把所有這些都考慮在內? –

回答

9

只要得到最後一部分,將其轉換爲int並將其作爲比較鍵返回

print(sorted(L, key=lambda x: int(x.split(".")[2]))) 

如果你想所有的部件要考慮,你可以這樣做

print(sorted(L, key=lambda x: [int(i) for i in x.rstrip(".").split(".")])) 

它消除.在字符串的末尾,並將它們拆分基於.,然後把每個和它的每一部分到int。返回的列表將用於比較。

你可以閱讀更多關於如何不同的序列將被Python相比,here

輸出

['1.1.1.','1.1.2.','1.1.3.','1.1.4.','1.1.10.','1.1.11.','1.1.12.','1.1.13.'] 
5

如果需要通過所有數字進行排序,產生整數序列中關鍵功能:

sorted(L, key=lambda v: [int(p) for p in v.split('.') if p.isdigit()]) 

該方法在t他面對點之間的非數字值。

演示:

>>> L = ['1.1.1.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.', '1.1.2.', '1.1.3.', '1.1.4.'] 
>>> sorted(L, key=lambda v: [int(p) for p in v.split('.') if p.isdigit()]) 
['1.1.1.', '1.1.2.', '1.1.3.', '1.1.4.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.'] 

你的具體嘗試只返回列表中的第二個數字,這對於你的樣本數據是總是1

相關問題