2017-06-20 81 views
0

我有一個這樣的名單:排序列表,但保持組與前綴一起

a = ['1', '3', '02', 'WF2', 'WF5', 'WF01'] 

,我想排序是這樣的:

a = ['1', '02', '3', 'WF01', 'WF2', 'WF5'] 

使用這樣的事情:

def sortby(id): 
    if 'WF' not in id and id.isdigit(): 
     return int(id) 
    elif 'WF' in id.upper(): 
     return float('inf') 

a.sort(key=sortby) 

我可以對沒有'WF'前綴的整數進行排序,但我不知道如何排序以'WF'爲前綴的整數。

我是否需要使用雙重排序,即再次排序並僅對具有前綴'WF'的排序進行排序並將-Inf分配給沒有'WF'前綴的所有其他條目? 有什麼想法?

編輯

def sortby(id): 
    if 'WF' not in id.upper(): 
     return int(id) 
    return float('inf') 

def sortby2(id): 
    if 'WF' not in id.upper(): 
     return float('-inf') 
    return int(id.replace('WF', '')) 

a.sort(key=sortby) 
a.sort(key=sortby2) 

,但它不是真正的好...

+0

可能[在Python中排序列表]的副本(https://stackoverflow.com/questions/5491913/sorting-list-in-python) – user1767754

+0

@ user1767754這不是,閱讀問題。我想維護兩個團體...... – tim

回答

6

返回對boolintbool將指定項目是否以WF開頭,第二項將是實際整數值。

>>> lst = ['1', '3', '02', 'WF2', 'WF5', 'WF01'] 

>>> def key(item): 
...  return item.startswith('WF'), int(item.lstrip('WF')) 
... 

>>> sorted(lst, key=key) 
['1', '02', '3', 'WF01', 'WF2', 'WF5'] 
+0

雖然Scott更快地寫出了這個概念,但你看起來更好一點 - >因此我會接受他的答案。但是,非常感謝:) – tim

+0

這不是關於他更快,而是關於哪種解決方案更好用,所以下次打開此線程時知道哪個答案更可取。你仍然可以贊成斯科特的回答,但選擇一個,你堅持爲你的問題。 – user1767754

3

只返回一個對作爲重點,首先要根據「WF」的存在或不存在,第二上的數字:

def sortby(id): 
    if 'WF' not in id and id.isdigit(): 
     return (0,int(id)) 
    elif 'WF' in id.upper(): 
     return (1,int(id[2:])) 
+0

謝謝,這是訣竅:)我知道必須有一些好的東西來管理這兩個團體,但沒有想到這樣使用元組。 – tim

2

你總是可以做到這一點:

a.sort(key=lambda x: (x[0] == "W", int(x.replace("WF", "")))) 
2

排序上一個元組檢查,如果字符串不以'WF'(優先級)開始,然後int值:

a.sort(key=lambda x: (x.startswith('WF'), int(x.strip('WF'))))  
print(a) 
#['1', '02', '3', 'WF01', 'WF2', 'WF5']