2017-06-27 5 views
0

Ich arbeite an einem Python-Projekt, wo ich den Header eines Pandas-Datenrahmens in einem Muster bestellen möchte. Meine resultierende Liste sieht wie folgt:Teilweise eine Liste bestellen Python

Match1 attribute1 attribute2 attribute3 ... attributeN Score1 Match2 attributeM Score2 ... Match3 Score3 

Ich mag würde die Elemente der Liste in dem folgenden Muster bestellen

Match1 Score1 Match2 Score2 Match3 Score3 attribute1 attribute2 attributeN ... 

Ich weiß, wie viele Paare von Spiel/Score gibt es in der Liste . Aber ich weiß nicht, wie viele Attribute es gibt (ich muss sie nicht bestellen). Diese werden alle durch die besondere Struktur der Daten bestimmt. Gibt es eine Möglichkeit für mich, die Reihenfolge einer solchen Liste neu zu ordnen?

Danke!

Ihre Hilfe wird sehr geschätzt!

Antwort

1

Mit sorted können Sie Schlüssel wie folgt angeben; Der erste Schlüssel Sortierspalten zum Ende Attribut, und der zweiten Schlüssel sortiert das Ergebnis durch die Zahl am Ende der Saiten:

# cols = df.columns 
cols = ['Match1', 'attribute1', 'attribute2', 'attribute3', 'attributeN', 'Score1', 'Match2', 'attributeM', 'Score2', 'Match3', 'Score3'] 

import re 
sorted(cols, key=lambda x: (not bool(re.match('match|score', x, flags=re.I)), re.sub(r'.*(\d+)$', r'\1', x))) 

#['Match1', 
# 'Score1', 
# 'Match2', 
# 'Score2', 
# 'Match3', 
# 'Score3', 
# 'attribute1', 
# 'attribute2', 
# 'attribute3', 
# 'attributeM', 
# 'attributeN'] 
+0

Dank zu starten die schnelle Antwort. Die Attribute sind jedoch nicht so strukturiert. Sie haben eine Mischung aus Namen. Gibt es noch einen Weg, dies zu tun, indem Sie die Methode ändern? – macintosh81

+0

Sie können den Schlüssel umgekehrt machen; Wenn Sie sicher sind, dass die Match- und Score-Spalten mit Match und Score beginnen, können Sie sie überprüfen und den Bool-Wert negieren, damit Sie ähnliche Ergebnisse erhalten. – Psidom

+0

Das funktioniert sehr gut! Danke für die elegante Lösung. – macintosh81

1

Hier ist einiger unvollständiger Code mit

index = 0 
for i in range(num_matches_and_scores]: 
    match1 = ??? # First instance of whatever you are trying to find 
    list1.remove(match1) 
    list1.insert(index, match1) 
    index += 1 
    score1 = ??? 
    list1.remove(score1) 
    list1.inset(index, score1) 
    index += 1 
+0

Ich habe die Idee und lass mich versuchen, es zu implementieren. Vielen Dank! – macintosh81

+0

Wenn dies die hilfreichste Antwort ist, würde ich es sehr schätzen, wenn Sie es als akzeptiert markieren. :) –