2017-04-05 106 views
0

我要自然排序,無論價值,我發現代碼來做到這一點其他地方堆,我不能將其納入我有什麼,Python的排序自然裏面的λ

這裏就是我有

[10, ['', '', '', '9']] 
[9, ['', '', '', '8']] 
[8, ['', '', '', '7']] 
[7, ['', '', '', '6']] 
[6, ['', '', '', '5']] 
[5, ['', '', '', '4']] 
[4, ['', '', '', '3']] 
[3, ['', '', '', '2']] 
[18, ['', '', '', '17']] 
[17, ['', '', '', '16']] 
[16, ['', '', '', '15']] 
[15, ['', '', '', '14']] 
[14, ['', '', '', '13']] 
[13, ['', '', '', '12']] 
[12, ['', '', '', '11']] 
[11, ['', '', '', '10']] 
[2, ['', '', '', '1']] 
[1, ['', '', '', '0']] 
:時,它通過其唯一的「0」是在索引中,右上角,「子列表[1] [3]」

sheet_lists = [[1, ['', '', '', '0']], 
      [2, ['', '', '', '1']], 
      [3, ['', '', '', '2']], 
      [4, ['', '', '', '3']], 
      [5, ['', '', '', '4']], 
      [6, ['', '', '', '5']], 
      [7, ['', '', '', '6']], 
      [8, ['', '', '', '7']], 
      [9, ['', '', '', '8']], 
      [10, ['', '', '', '9']], 
      [11, ['', '', '', '10']], 
      [12, ['', '', '', '11']], 
      [13, ['', '', '', '12']], 
      [14, ['', '', '', '13']], 
      [15, ['', '', '', '14']], 
      [16, ['', '', '', '15']], 
      [17, ['', '', '', '16']], 
      [18, ['', '', '', '17']]] 

sheet_lists.sort(key=lambda lst: lst[1][3], reverse=True) 

for l in sheet_lists: 
    print (l) 

這產生的輸出是排序的主要子列表的順序

我希望:

[18, ['', '', '', '17']] 
[17, ['', '', '', '16']] 
[16, ['', '', '', '15']] 
[15, ['', '', '', '14']] 
[14, ['', '', '', '13']] 
[13, ['', '', '', '12']] 
[12, ['', '', '', '11']] 
[11, ['', '', '', '10']] 
[10, ['', '', '', '9']] 
[9, ['', '', '', '8']] 
[8, ['', '', '', '7']] 
[7, ['', '', '', '6']] 
[6, ['', '', '', '5']] 
[5, ['', '', '', '4']] 
[4, ['', '', '', '3']] 
[3, ['', '', '', '2']] 
[2, ['', '', '', '1']] 
[1, ['', '', '', '0']] 

正如您所看到的,這種排序不正確並且注意:我不想在排序前將值簡單地轉換爲INT或FLOAT。這是因爲我預計包含字母或可能符號的值。

下面的代碼進行自然排序的平面列表,信用:https://blog.codinghorror.com/sorting-for-humans-natural-sort-order/

import re 
def sort_nicely(l): 
    convert = lambda text: int(text) if text.isdigit() else text 
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
    l.sort(key=alphanum_key) 

我似乎就是無法將其納入我的功能,因爲我有打電話給lambda來選擇包含在一個值列表中的子列表

+0

你得到的輸出是什麼,你期望它是什麼 – user1767754

+0

你可以在上面的代碼中更改'alphanum_key'來提取你想要的子列表元素。然後'sort_nicely'將在您的特定列表上運行。所以最後'key'是適當的元素,所以',key [1] [3])]'在那裏結束。 – pvg

+0

如果你期望字母和符號,你應該添加一些樣本輸入和輸出,以便a)人們不再告訴你只需轉換爲數字,b)你想要完成的種類更清晰。 – pvg

回答

2

你的主要功能是:

lambda lst: lst[1][3]

它需要要排序的元素和,知道其特定的結構,提取一些位從它被用作排序鍵。要使用的排序算法生成的關鍵是這樣的:

alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]

它採用元素和munges以某種方式神奇的方法來達到他們所說的「自然」的排列順序。你可以很容易地將這兩者結合起來,因爲在你的情況下,唯一的變化就是你不想要這個元素本身,你想要它的一些子部分。而不是上面的key(相當於你的lst),你需要key[1][3]。所以進行更改

alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key[1][3]) ]

現在,神奇的改寫(munging)發生在子元素你有興趣和sort_nicely作品您的特定結構上。

+0

這是對的,謝謝,我會接受你的回答。作爲一個附加問題,如果你知道正則表達式,如何在RE中包含負數,當我在子列表中將'1'更改爲'-1'時,它不會正確排序 – citizen2077

+0

@new_to_coding這就是爲什麼我是糾纏你的樣本數據,我不知道什麼排序對你來說是「正確的」。可能值得考慮一下你想要的排序順序 - 從你說的一些事情來看,這幾乎意味着你真的想要一個多字段的排序,而不是那種「人類可讀的」排序。如果這是真的,那麼它會影響你如何構建你的數據。如果你把它全部弄清楚,只要提出一個新的問題,並提出相關的上下文。 – pvg

+0

是的,我會拿出一些樣本數據和預期的輸出,並在稍後問一個新問題,謝謝你的幫助 – citizen2077

0

*誤讀的問題,留給子孫後代。

sheet_lists.sort(key=lambda lst: lst[1][3], reverse=True) 

應該

sheet_lists.sort(key=lambda lst: int(lst[1][3]), reverse=True) 

字符串比較VS整數

或者,您標準化數據不存儲整數爲字符串。

sheet_lists = [[1, ['', '', '', 0]], 
      [2, ['', '', '', 1]], 
      [3, ['', '', '', 2]], 
      [4, ['', '', '', 3]], 
... etc 
+1

問題具體說不想轉換爲數字。 – pvg

+0

Oop;本來沒有注意到。 – wom