2010-07-15 21 views
5

Ho una lista di righe lette da un file. Ho bisogno di ordinare la lista per data e ora. Ho analizzato il timestamp usando espressioni regolari e le ho inserite in un elenco separato. Gli indici delle due liste corrisponderanno. Una volta che ho ordinato l'elenco dei timestamp, posso ottenere l'ordine degli indici.Ordina elenco per ordine dato di indici

C'è un modo per applicare lo stesso ordine di indici all'elenco di linee originale? Il risultato dovrebbe essere la lista ordinata di linee originali.

Esempio:

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] 

risposta

4

Penso che si potrebbe fare

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

Ma se avete (o potrebbe scrivere) una funzione per estrarre automaticamente il tempo dalla linea ,

def extract_time(line): 
    ... 
    return time 

si potrebbe anche fare

listofLines.sort(key=extract_time) 

o se si desidera mantenere l'elenco originale intatta,

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

Se si desidera ordinare l'elenco originale perché, dite, riferimenti Hald ad esso altrove , è possibile assegnare ad esso la lista ordinata:

my_list[:] = [my_list[i] for i in sorted_indexes] # [:] is key! 
Problemi correlati