如何在一个列表中找到另一个列表的索引

2024-03-29 06:28:16 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上我有一个txt文件,它是fortran模型的输出。输出有点像这样:

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非常熟悉。那么,如果列表(main2)的第一个值=='Temp(K)',我如何在列表(main2)中找到该列表的索引呢?你知道吗

注意。我用np和matplot来绘制之后的数据。你知道吗


Tags: 文件intxt列表formodeltitlevalue
3条回答

将文件读入列表。你知道吗

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

获取开始温度的行数(使用列表理解,因为它很快):

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

获取温度,再次列出一个列表。你知道吗

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

如果需要,您甚至可以将其合并为一个列表:

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

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]

这个怎么样:

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)

这可以使用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])

相关问题 更多 >