2011-09-07 35 views
0

這聽起來像一個愚蠢的問題,但我試圖找到一個沒有太多成功的答案。我有一個列表的列表:排序漂浮數字 - 不是按ascii順序 - 在python

for v in sorted(list): 
    print v 


[885.1, 12824] 
[885.1, 19843] 
[885.11, 1319] 
[885.12, 1155] 
[885.13, 12844] 
[885.14, 33602] 
[885.15, 11324] 
[885.16, 44040] 
[885.2, 119283] 
[885.3, 8424] 

我已經通過使用排序功能我的名單迭代 - 但是,帶來了ASCII順序的項目如上 - 可他們在一個人類可讀的排序爲花車訂購?即:

[885.1, 19843] 
[885.2, 119283] 
[885.3, 8424] 
[885.11, 1319] 
[885.12, 1155] 
[885.13, 12844] 
[885.14, 33602] 
[885.15, 11324] 
[885.16, 44040] 

我是否需要創建somekind的索引?將我的浮動轉換爲整數?任何幫助非常感謝。

David。

+7

原始排序已經以數字順序排列 - 885.16小於885.2(0) – Feanor

+0

在您的輸入列表中,您有_two_值,其中885.1首先出現。我假設你希望那些_both_出現在你的輸出中,對吧?你想在排序時考慮它們,對嗎? –

回答

1

你需要給排序的比較函數。像下面這樣:

sorted(list, cmp=lambda x, y: cmp(x[0], y[0])) 

只寫你所需要的功能,你想要的東西並將它插入

你可能會想是一個反向基數排序。

3

浮動轉換爲字符串第一和拆呢。 「」:

sorted(a, key=lambda x:map(int, str(float(x[0])).split("."))) 
1

這是怎樣的一個黑客,但:

a = [ 
    [885.1, 19843], 
    [885.1, 12824], 
    [885.11, 1319], 
    [885.12, 1155], 
    [885.13, 12844], 
    [885.14, 33602], 
    [885.15, 11324], 
    [885.16, 44040], 
    [885.2, 119283], 
    [882.8, 8424], 
    [882.75, 8424], 
    [885.3, 8424] 
] 

for v in sorted(a, key=lambda t: str(t[0]).split(".")[0] + ("%05d" % int(str(t[0]).split(".")[1])) + "," + str(t[1])): 
    print v 

結果是

[882.8, 8424] 
[882.75, 8424] 
[885.1, 12824] 
[885.1, 19843] 
[885.2, 119283] 
[885.3, 8424] 
[885.11, 1319] 
[885.12, 1155] 
[885.13, 12844] 
[885.14, 33602] 
[885.15, 11324] 
[885.16, 44040] 

免責聲明:這個假設在小數點後最多有5個地方。相應地調整。