2010-07-15 4 views
5

J'ai une liste de lignes lues dans un fichier. J'ai besoin de trier la liste par horodatage. J'ai analysé l'horodatage en utilisant des expressions régulières et les place dans une liste séparée. Les indices des deux listes vont correspondre. Une fois que je trier la liste des horodatages, je peux obtenir l'ordre des indices.Liste de tri par ordre d'index donné

Existe-t-il un moyen d'appliquer le même ordre d'index à la liste de lignes d'origine? Le résultat devrait être la liste triée des lignes originales.

Exemple:

listofLines = ['log opened 16-Feb-2010 06:37:56 UTC', 
       '06:37:58 Custom parameters are in use', 
       'log closed 16-Feb-2010 05:26:47 UTC'] 
listofTimes = ['06:37:56', '06:37:58', '05:26:47'] 
sortedIndex = [2,0,1] 

Répondre

4

Je pense que vous pourriez faire

[line for (time,line) in sorted(zip(listofTimes, listofLines))] 

Mais si vous avez (ou pourrait écrire) une fonction d'extraire automatiquement le temps de la ligne ,

def extract_time(line): 
    ... 
    return time 

vous pouvez aussi faire

listofLines.sort(key=extract_time) 

ou si vous voulez garder la liste originale intacte,

sorted(listofLines, key=extract_time) 
2
sorted(zip(listofTimes, listofLines)) 
17
[listofLines[i] for i in sortedIndex] 
0

Si vous voulez trier la liste initiale parce que vous, dites, références Hald à ailleurs , vous pouvez lui affecter la liste triée:

my_list[:] = [my_list[i] for i in sorted_indexes] # [:] is key! 
Questions connexes