2017-07-05 3 views
2

Zum Beispiel ist es eine Möglichkeit, die folgenden zu sortieren:Python: Gibt es eine Möglichkeit, eine Zeichenfolge mit nur ausgewählten Zeichen in der Zeichenfolge zu sortieren?

model_1_depth/depth_w/read/_79__cf__79 
model_2_depth/depth_w/read/_73__cf__73 
model_3_depth/depth_w/read/_67__cf__67 
model_4_depth/depth_w/read/_61__cf__61 
model_5_depth/depth_w/read/_55__cf__55 
model_6_depth/depth_w/read/_49__cf__49 
model_7_depth/depth_w/read/_43__cf__43 
model_8_depth/depth_w/read/_37__cf__37 
model_9_depth/depth_w/read/_31__cf__31 
model_10_depth/depth_w/read/_25__cf__25 
model_11_depth/depth_w/read/_19__cf__19 
model_12_depth/depth_w/read/_13__cf__13 
model_13_depth/depth_w/read/_7__cf__7 
model_13_point/weights/read/_4__cf__4 
model_12_point/weights/read/_10__cf__10 
model_11_point/weights/read/_16__cf__16 
model_10_point/weights/read/_22__cf__22 
model_9_point/weights/read/_28__cf__28 
model_8_point/weights/read/_34__cf__34 
model_7_point/weights/read/_40__cf__40 
model_6_point/weights/read/_46__cf__46 
model_5_point/weights/read/_52__cf__52 
model_4_point/weights/read/_58__cf__58 
model_3_point/weights/read/_64__cf__64 
model_2_point/weights/read/_70__cf__70 
model_1_point/weights/read/_76__cf__76 
model_0/weights/read/_82__cf__82 

nur mit der Ganzzahl, die nach dem „Modell“ kommt? Ich habe versucht, nur diese Ganzzahlen mit re.sub("_", "", re.sub(r'[^\w]', '', key[6:8])) zu erfassen, um die ganzen Zahlen zu sortieren, aber ich bin nicht in der Lage, das sortierte Ergebnis zu verwenden, um die ursprünglichen Zeichenfolgen zu finden, da es einige Duplikate gibt, wie '1' gehört sowohl model_1_point/weights/read/_76__cf__76 als auch model_1_depth/depth_w/read/_79__cf__79 und es wird nicht möglich sein, die beiden zu unterscheiden.

Gibt es eine elegante Möglichkeit, dies zu tun?

EDIT: Um zu verdeutlichen, sind die folgenden Zeichenfolgen in einem Wörterbuch, und ich möchte so sortieren, dass 1 die kleinste und 13 die größte ist.

+0

sind diese Strings in einem 'list' oder so etwas? –

+0

Wenn das Problem, das Sie haben, ist, dass das keine Liste ist, können Sie es mit 'your_string.split()' –

+1

'b = sortierten (a, Schlüssel = Lambda x: int (x.split (')/') [0] .split (' _ ') [1]))' aber ich würde eine 're'gex-Lösung bevorzugen. –

Antwort

3

eine Version mit regex:

rgx = re.compile('model_(?P<number>\d+)') 
srtd = sorted(mods, key=lambda x: int(rgx.match(x).group('number'))) 

der reguläre Ausdruck model_(?P<number>\d+) fängt die Zahlen \d+ (gierig) nach der Zeichenfolge model_. In der key of sorted wird dies dann in eine int umgewandelt.

i angenommen Ihre Eingabe in einer Liste mods der Form genannt wird:

mods = [ 
    'model_1_depth/depth_w/read/_79__cf__79', 
    'model_2_depth/depth_w/read/_73__cf__73', 
    'model_3_depth/depth_w/read/_67__cf__67', 
    'model_4_depth/depth_w/read/_61__cf__61', 
    ... 
    ] 

wenn es nur die Zeichenfolge, die Sie Sie irgendwie in diese Form bringen müss vorgestellt.


etwas weniger ausführlich (keine benannte Gruppe) die gleichen wie dies erreicht werden könnte:

rgx = re.compile('model_(\d+)') 
srtd = sorted(mods, key=lambda x: int(rgx.match(x).group(1))) 
2

Vor diesem Eingang:

my_text = '''model_1_depth/depth_w/read/_79__cf__79 
model_2_depth/depth_w/read/_73__cf__73 
model_3_depth/depth_w/read/_67__cf__67 
model_4_depth/depth_w/read/_61__cf__61 
model_5_depth/depth_w/read/_55__cf__55 
model_6_depth/depth_w/read/_49__cf__49 
model_7_depth/depth_w/read/_43__cf__43 
model_8_depth/depth_w/read/_37__cf__37 
model_9_depth/depth_w/read/_31__cf__31 
model_10_depth/depth_w/read/_25__cf__25 
model_11_depth/depth_w/read/_19__cf__19 
model_12_depth/depth_w/read/_13__cf__13 
model_13_depth/depth_w/read/_7__cf__7 
model_13_point/weights/read/_4__cf__4 
model_12_point/weights/read/_10__cf__10 
model_11_point/weights/read/_16__cf__16 
model_10_point/weights/read/_22__cf__22 
model_9_point/weights/read/_28__cf__28 
model_8_point/weights/read/_34__cf__34 
model_7_point/weights/read/_40__cf__40 
model_6_point/weights/read/_46__cf__46 
model_5_point/weights/read/_52__cf__52 
model_4_point/weights/read/_58__cf__58 
model_3_point/weights/read/_64__cf__64 
model_2_point/weights/read/_70__cf__70 
model_1_point/weights/read/_76__cf__76 
model_0/weights/read/_82__cf__82''' 

Sie können wie folgt vorgehen:

my_text = my_text.split('\n') 

b = sorted(my_text, key=lambda x: int(x.split('/')[0].split('_')[1])) 
my_text_out = '\n'.join(b) 
print(my_text_out) 

, die in diesen Ergebnisse:

model_0/weights/read/_82__cf__82 
model_1_depth/depth_w/read/_79__cf__79 
model_1_point/weights/read/_76__cf__76 
model_2_depth/depth_w/read/_73__cf__73 
model_2_point/weights/read/_70__cf__70 
model_3_depth/depth_w/read/_67__cf__67 
model_3_point/weights/read/_64__cf__64 
model_4_depth/depth_w/read/_61__cf__61 
model_4_point/weights/read/_58__cf__58 
model_5_depth/depth_w/read/_55__cf__55 
model_5_point/weights/read/_52__cf__52 
model_6_depth/depth_w/read/_49__cf__49 
model_6_point/weights/read/_46__cf__46 
model_7_depth/depth_w/read/_43__cf__43 
model_7_point/weights/read/_40__cf__40 
model_8_depth/depth_w/read/_37__cf__37 
model_8_point/weights/read/_34__cf__34 
model_9_depth/depth_w/read/_31__cf__31 
model_9_point/weights/read/_28__cf__28 
model_10_depth/depth_w/read/_25__cf__25 
model_10_point/weights/read/_22__cf__22 
model_11_depth/depth_w/read/_19__cf__19 
model_11_point/weights/read/_16__cf__16 
model_12_depth/depth_w/read/_13__cf__13 
model_12_point/weights/read/_10__cf__10 
model_13_depth/depth_w/read/_7__cf__7 
model_13_point/weights/read/_4__cf__4 

Aber wie gesagt ich in den Kommentaren, ein regex Lösung fühlt sich hier angemessener an.

+0

Danke für deine Antwort, es funktioniert auch! Die Regex-Lösung, die ich glaube, ist diese: 'sortierte (Wörterbuch, Schlüssel = Lambda-Schlüssel: int (re (" _ "," ", re (r '[^ \ w]', '', Schlüssel [6 : 8])))) ', was ich etwas modifiziert habe von jemand anderem, der vorher gepostet hat, indem ich davor ein int hinzufügte (weiß nicht, wo seine Antwort hinlief). Vielen Dank für die schnelle Antwort. – kwotsin

Verwandte Themen