2017-10-17 119 views
0

我試圖通過幾個條件(長度,後綴和按照該順序的字母順序)來排序。我不能完全得到一握就可以了,雖然,我似乎能夠做的是排序長度...按三個條件排序的Python

這裏是我的代碼(蟒蛇2.7.9):

#!/usr/bin/python 

sortme = [ 
    'one.ab', 
    'two.ef', 
    'three.ab', 
    'six.ef', 
    'seven.jk', 
    'eight.ef', 
    'nine.xy', 
    'five.xy', 
    'ten.ab', 
    'Four.ef' 
] 

sortme.sort(key=lambda item: (-len(item), item), reverse=True) 

print(sortme) 

這得到長度的一部分,但我真的試圖讓:

(ab) 
one.ab 
ten.ab 
three.ab 

(ef) 
six.ef 
two.ef 
four.ef 
eight.ef 

(jk) 
seven.jk 

(xy) 
five.xy 
nine.xy 

回答

1

您可以指定多個排序鍵爲一個元組:

sortme.sort(key=lambda item: (item.split('.')[1], len(item), item), reverse=False) 

print("\n".join(sortme)) 

輸出:

one.ab 
ten.ab 
three.ab 
six.ef 
two.ef 
Four.ef 
eight.ef 
seven.jk 
five.xy 
nine.xy 
+0

這似乎上班,謝謝!對後綴進行分組或很難分開它們? –

+0

您可以查看字典和setdefault方法。類似'd.setdefault(suffix,[])。append(item)' – GWW

0
sortme.sort(key=lambda item: (-len(item),item.rsplit(".",1)[-1], item), reverse=True) 

你只需要添加你的第三個條件......我真的建議坐下來與導師或你的老師。

你總是可以打破它關到自己funtion以使其更容易理解

def sort_key(item): 
    return -len(item),item.rsplit(".",1)[-1],item 

sortme.sort(key=sort_key,reverse=True) 
+0

無論出於何種原因,每次嘗試時都會產生「無」,謝謝。 –

+0

'a.sort'對數組進行排序並返回none,實際的數組被改變...使用'sorted(sortme,key = sort_key,reverse = True)'如果你想返回一個新的排序數組 –

0

您也可以試試cmp功能:

import re 


sortme = [ 
    'one.ab', 
    'two.ef', 
    'three.ab', 
    'six.ef', 
    'seven.jk', 
    'eight.ef', 
    'nine.xy', 
    'five.xy', 
    'ten.ab', 
    'Four.ef' 
] 

def _cmp(first, second): 
    first_type = first.split('.')[-1] 
    second_type = second.split('.')[-1] 
    if first_type == second_type: 
     return cmp(len(first), len(second)) 

    return cmp(first_type, second_type) 

sortme.sort(cmp=_cmp) 

print(sortme) 
+0

這會在「nine.xy」後加上「five.xy」,所以有些東西似乎有點不合時宜,謝謝。 –