2017-03-26 9 views
0

Grundsätzlich habe ich eine TXT-Datei, die eine Ausgabe von einem Fortran-Modell ist. Die Ausgabe sieht ein wenig wie folgt aus:So finden Sie den Index einer Liste in einer Liste

Title:Model 

Temp(K) Ionic str Rho Phi H2O Ice ... 
273.15  4   1.003 1.21 1000 0.00 

Species Ini Conc Final Conc  Act .... 
H   0.0   0.12032  0.59 
NH4  3.0   3.00   0.43 
Cl   1.0   1.00   0.47 
... 

Title:Model 

Temp(K) Ionic str Rho Phi H2O Ice ... 
273.15  4   1.003 1.21 1000 0.00 

Species Ini Conc Final Conc  Act .... 
H   0.0   0.12032  0.59 
NH4  3.0   3.00   0.43 
Cl   1.0   1.00   0.47 
... 

Jeder Schritt ist ein weiterer Satz, wie das oben so schließlich ich eine TXT-Datei mit 3000+ Schritte haben.

Also möchte ich alle Temperaturen bei jedem Schritt abrufen. Ich versuche etwas zu schreiben, um alle Punkte zu indizieren, wo 'Temp (K)' erscheint und füge dann 1 zu diesem Index hinzu, um den Ort der tatsächlichen Temperatur zu erhalten.

Mein Code sieht wie folgt aus:

import numpy as np 
import matplotlib.pyplot as plt 
main=[] 
main2=[] 
count=0 
with open('FrOut.txt', 'r') as f: 
    data=f.readlines() 
    for line in data: 
     main.append(line.split(',')) 
for value in main: 
    for x in value: 
     main2.append(x.split()) 
for value in main2: 
    for x in value: 
      if x=='Temp(K)':count+=1 

So offensichtlich ist dies nicht der eleganteste Weg, aber ich bin sehr viel in den tiefen Ende mit Python. Wie finde ich den Index einer Liste in der Liste (main2), wenn der erste Wert dieser Liste == 'Temp (K)'?

Nb. Ich benutze np und matplot, um die Daten danach zu plotten.

Antwort

0

die Datei in eine Liste lesen.

with open('FrOut.txt', 'r') as f: 
    data=f.readlines() 

die Nummern der Linien erhalten, die eine Temperatur (unter Verwendung einer Liste Verständnis, weil es schnell ist) beginnen:

die Temperaturen holen, wieder mit einer Liste Verständnis.

temps = [float(data[n].split()[0]) for n in idx] 

Falls gewünscht, können Sie auch diese verbinden sich zu einer Liste Verständnis:

temps = [float(data[n+1].split()[0]) for n, ln in enumerate(data) if ln.startswith('Temp(K)')] 

Ein Beispiel in IPython:

In [1]: text = '''Title:Model 
    ...: 
    ...: Temp(K) Ionic str Rho Phi H2O Ice ... 
    ...: 273.15  4   1.003 1.21 1000 0.00 
    ...: 
    ...: Species Ini Conc Final Conc  Act .... 
    ...: H   0.0   0.12032  0.59 
    ...: NH4  3.0   3.00   0.43 
    ...: Cl   1.0   1.00   0.47 
    ...: ... 
    ...: 
    ...: Title:Model 
    ...: 
    ...: Temp(K) Ionic str Rho Phi H2O Ice ... 
    ...: 273.15  4   1.003 1.21 1000 0.00 
    ...: 
    ...: Species Ini Conc Final Conc  Act .... 
    ...: H   0.0   0.12032  0.59 
    ...: NH4  3.0   3.00   0.43 
    ...: Cl   1.0   1.00   0.47 
    ...: ... 
    ...: ''' 

In [2]: data = text.splitlines() 

In [3]: idx = [n+1 for n, ln in enumerate(data) if ln.startswith('Temp(K)')] 

In [4]: idx 
Out[4]: [3, 14] 

In [5]: [float(data[n].split()[0]) for n in idx] 
Out[5]: [273.15, 273.15] 

In [6]: [float(data[n+1].split()[0]) for n, ln in enumerate(data) if ln.startswith('Temp(K)')] 
Out[6]: [273.15, 273.15] 
+0

Sie durchlaufen den Text zweimal, wobei die Indexsuche in der zweiten Liste berücksichtigt wird. Du könntest einfach 'enumerate()' stattdessen benutzen und nur einmal Schleife machen. –

+0

Im zweiten Verständnis, bin ich über die * Indizes *, nicht über die ganze Liste der Zeilen. Ich hätte es tatsächlich in einem einzigen Verständnis tun können. In diesem Fall wähle ich es aus Gründen der Klarheit zu teilen. –

+0

Wie gesagt, der Index Lookup. 'enumerate()' ist einmal eindeutiger als zwei Listen-Comprehensions, die 'enumerate() 'verwenden, wie es ist. –

0

Dies kann mit Pythons enumerate() Funktion durchgeführt werden.

Hier ist ein Beispiel für das Extrahieren der Indizes. (! Und, nur zum Spaß, die Temperaturen zu)

idxs = [] 
tempature_values = [] 
for idx, value in enumerate(main2): 
    # Check if value is not empty & the first element is 'Temp(K)' 
    if value and value[0] == 'Temp(K)': 
     idxs.append(idx) 
     temp_values.append(main2[idx+1][0]) 
+0

Danke, das gut funktioniert. – potatasbravas

0

Wie wäre es damit:

temp_rows = [] 

with open(f, 'rb') as fin: 
    reader = csv.reader(fin) 
    for index, row in enumerate(reader): 
     if 'Temp(K)' in [word for words in row for word in words.split()]: 
      temp_rows.append(index) 
Verwandte Themen