2017-06-20 3 views
0

ich eine Liste wie diese haben:Sortierliste in Python aber halten Gruppen mit dem Präfix zusammen

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

und ich möchte so sortieren:

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

etwas wie folgt verwenden:

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) 

Ich kann die ganzen Zahlen ohne 'WF' Präfix sortieren, aber ich weiß nicht, wie man diejenigen mit dem Präfix 'WF' selbstständig sortiert.

Muss ich die doppelte Sortierung verwenden, also erneut sortieren und nur diejenigen mit dem Präfix 'WF' sortieren und allen anderen Einträgen ohne 'WF' Präfix -Inf zuweisen? Irgendeine Idee?

EDIT:

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) 

aber es ist nicht wirklich schön ...

+0

Mögliche Duplikat von [Sortierung Liste in Python] (https://stackoverflow.com/questions/5491913/sorting-list-in-python) – user1767754

+0

@ user1767754 Es ist nicht, lesen Sie die Frage. Ich möchte zwei Gruppen verwalten ... – tim

Antwort

6

Return Paar bool und int. bool gibt an, ob der Artikel mit WF beginnt und der zweite Artikel der tatsächliche ganzzahlige Wert ist.

>>> 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

Deines sieht ein bisschen schöner aus, obwohl Scott das Konzept schneller geschrieben hat -> daher werde ich seine Antwort akzeptieren. Aber danke auch :) – tim

+0

Es geht nicht darum, dass er schneller ist, es geht darum, welche Lösung besser zu verwenden ist, also wissen die nächsten Leute, die diesen Thread öffnen, welche Antwort vorzuziehen war. Sie können Scotts Antwort immer noch verbessern, aber wählen Sie diejenige, an der Sie für Ihr Problem festhalten. – user1767754

3

nur ein Paar als den Schlüssel, der erste auf das Vorhandensein oder Fehlen von „WF“ basiert, die zweite auf die Zahl:

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

Danke, das macht den Trick :) Ich wusste, dass es etwas Nettes geben musste, um diese beiden Gruppen zu verwalten, aber ich dachte nicht daran, Tupel so zu benutzen. – tim

2

Man könnte dies immer tun:

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

Sortieren auf einem Tupel zu überprüfen, ob Zeichenfolge nicht Start mit'WF' (Priorität) und dann dem int-Wert:

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