2017-03-26 16 views
0

私は基本的に、fortranモデルの出力を持つtxtファイルを持っています。出力は少し次のようになります。リスト内のリストのインデックスを見つける方法

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 
... 

各ステップは、その最終的に、私は3000の+の手順でtxtファイルを持っている上記のような別のセットを追加します。

私は各段階ですべての気温を思い出したいと思います。私は 'Temp(K)'が現れるすべてのポイントをインデックスするために何かを書いて、そのインデックスに1を加えて実際の温度の位置を取得しようとしています。

私のコードは次のようになります。

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 

だから、明らかに、これが最もエレガントな方法はありませんが、私は、Pythonとの深い最後には非常に多くのです。だからリストの最初の値== 'Temp(K)'なら、リスト内のリストのインデックスを(main2)見つける方法は?

Nb。私はこの後にデータをプロットするためにnpとmatplotを使用しています。

答えて

0

は、リストにファイルを読み込みます。

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

(それは速いですので、リストの内包表記を使用して)温度をスタートライン数を取得します。

はリスト内包して再び、温度を取得します。

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

希望、あなたが一つでもリストの内包にこれを組み合わせることができた場合:IPython

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

例:

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

テキストを2回ループして、2番目のリストの索引ルックアップを考慮しています。代わりに、単に 'enumerate()'を使って、一度だけループすることができます –

+0

第2の理解では、私は線のリスト全体ではなく、*索引*をループしています。私は確かにそれを単一の理解で行うことができました。この場合、分かりやすくするために分割します。 –

+0

私が言ったように、インデックスルックアップ。 'enumerate()'は、そのまま 'enumerate()'を利用する2つのリスト内包よりもはっきりしています。 –

0

これは、Pythonのenumerate()関数を使用して行うことができます。

次に、インデックスの抽出例を示します。 (そして、楽しみのためだけに、あまりにも温度!)この程度

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

おかげで、これはうまく動作します。 – potatasbravas

0

方法:

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) 
関連する問題