从二维列表中提取值以对其进行操作

Extract values from a two-dimensional list to operate with them

我正在尝试从二维列表中提取值,以保存它们并对其执行操作,原则上我从 3 行 145、154 和 157 中获取值,但问题是我需要去遍历整个值列表并提取接下来的 3 行,即每 145 行一行,每 154 行另一行和每 157 行另一行,直到您读完整个列表。

path.dat 内容示例:

       1      1.0000  0.258309E+03   0.387369E-05   0.493390E-05
       2      2.0000  0.263808E+03   0.369658E-05   0.733094E-05
       3      3.0000  0.264706E+03   0.351946E-05   0.817271E-05
       4      5.0000  0.248739E+03   0.369658E-05   0.103040E-04
       5      7.0000  0.234918E+03   0.351946E-05   0.119915E-04
       6     10.0000  0.223707E+03   0.316522E-05   0.114943E-04
       7     20.0000  0.215601E+03   0.298810E-05   0.941933E-05
       8     30.0000  0.215591E+03   0.281098E-05   0.816810E-05
       9     50.0000  0.213185E+03   0.281098E-05   0.476642E-05
      10     70.0000  0.212209E+03   0.298810E-05   0.271009E-05
      11    100.0000  0.213632E+03   0.263386E-05   0.783644E-06
      12    125.0000  0.216840E+03   0.298810E-05   0.118827E-05
      13    150.0000  0.215781E+03   0.351946E-05   0.103647E-05
      14    175.0000  0.212525E+03   0.741608E-05   0.625855E-06
      15    200.0000  0.210277E+03   0.129068E-04   0.377638E-06
      16    225.0000  0.211308E+03   0.178661E-04   0.189399E-06
      17    250.0000  0.213660E+03   0.233568E-04   0.998937E-07
      18    300.0000  0.222232E+03   0.410687E-04   0.872060E-07
      19    350.0000  0.231604E+03   0.108728E-03   0.800548E-07
      20    400.0000  0.239510E+03   0.135473E-03   0.809775E-07
      21    450.0000  0.246600E+03   0.144506E-03   0.793627E-07
      22    500.0000  0.253364E+03   0.299663E-03   0.738263E-07
      23    550.0000  0.259311E+03   0.679052E-03   0.717501E-07
      24    600.0000  0.263732E+03   0.144970E-02   0.719808E-07
      25    650.0000  0.267508E+03   0.195502E-02   0.749797E-07
      26    700.0000  0.271180E+03   0.218368E-02   0.765945E-07
      27    750.0000  0.273655E+03   0.174336E-02   0.768252E-07
      28    775.0000  0.274527E+03   0.131243E-02   0.779786E-07
      29    800.0000  0.275410E+03   0.941542E-03   0.798241E-07
      30    825.0000  0.275755E+03   0.106978E-02   0.809775E-07
      31    850.0000  0.275817E+03   0.234202E-02   0.816696E-07
      32    875.0000  0.277539E+03   0.300675E-02   0.821309E-07
      33    900.0000  0.279860E+03   0.305316E-02   0.823616E-07
      34    925.0000  0.282089E+03   0.310133E-02   0.802855E-07
      35    950.0000  0.283788E+03   0.317501E-02   0.701353E-07
      36    975.0000  0.285004E+03   0.317767E-02   0.701353E-07
file = open('path.dat', 'r')

我阅读文件并转到列表列表:

listA = []
for line in file.readlines():
    a = line.split()
    listA.append(a)

示例 listA:

listA = [
    ['5', '0.0000', '0.9992', '0.9999', '0.9999'],
    ['6', '0.0000', '0.9986', '0.9999', '0.9999'],
    ['7', '0.0000', '0.9977', '0.9997', '0.9999'],
    ['8', '0.0000', '0.9961', '0.9992', '0.9998'],
    ['9', '0.0000', '0.9945', '0.9987', '0.9997'],
    ['10', '0.0000', '0.9928', '0.9980', '0.9995'],
    ['11', '0.0000', '0.9914', '0.9975', '0.9994'],
    ['12', '0.0000', '0.9901', '0.9972', '0.9992'],
    ['13', '0.0000', '0.9889', '0.9968', '0.9990'],
    ['14', '0.0000', '0.9877', '0.9965', '0.9988'],
    ['15', '0.0000', '0.9864', '0.9962', '0.9986'],
    ['16', '0.0000', '0.9851', '0.9959', '0.9984'],
    ['17', '0.0000', '0.9836', '0.9956', '0.9982'],
    ['18', '0.0000', '0.9813', '0.9950', '0.9978'],
    ['19', '0.0000', '0.9783', '0.9943', '0.9973'],
    ['20', '0.0000', '0.9751', '0.9936', '0.9967'],
    ['21', '0.0000', '0.9713', '0.9927', '0.9959'],
    ['22', '0.0000', '0.9673', '0.9917', '0.9949'],
    ['23', '0.0000', '0.9634', '0.9906', '0.9939'],
    ['24', '0.0000', '0.9586', '0.9894', '0.9925'],
    ['25', '0.0000', '0.9517', '0.9876', '0.9904'],
    ['26', '0.0000', '0.9408', '0.9847', '0.9866'],
    ['27', '0.0000', '0.9280', '0.9806', '0.9811'],
    ['28', '0.0000', '0.9178', '0.9769', '0.9760'],
    ['29', '0.0000', '0.9117', '0.9745', '0.9727'],
    ['30', '0.0000', '0.9022', '0.9706', '0.9673'],
    ['31', '0.0000', '0.8916', '0.9656', '0.9603'],
    ['32', '0.0000', '0.8831', '0.9610', '0.9540'],
    ['33', '0.0000', '0.8696', '0.9532', '0.9433']
]

有了这个,我读取了一个 .dat.txt 文件,有 60,000 行并将其保存在一个二维列表中。 为了提取我需要的值,我尝试了以下方法:

for i in listA:    
    line_A = listA[145] # Here I declare that I want to extract line 145
    line_B = listA[154] # Here I declare that I want to extract line 154
    line_C = listA[157] # Here I declare that I want to extract line 157

这里我把string传给了float类型,为了能和他们一起操作:

totalA = float(line_A[1]), float(line_A[2]), float(line_A[3])
totalB = float(line_B[1]), float(line_B[2]), float(line_B[3])
totalC = float(line_C[1]), float(line_C[2]), float(line_C[3])

print(totalA)
print(totalB)
print(totalC)

(48.47, 89.82, 101.94)
(48.37, 89.72, 101.79)
(6.17, 5.56, 8.49)

file.close()

原则上,我得到了我需要的行,145、154 和 157,我将它们移动到浮动以使用它们的值进行操作,但是我需要每 145 行提取一行,每 154 行提取另一行依此类推,直到我阅读整个列表。

你的问题不是很清楚,但如果答对了,我想这会实现你的目标:

steps = (145, 154, 157)

with open('path.dat') as f:
    rows = f.readlines()

    for step in steps:
        # select every 'step' rows
        a = [_.strip().split() for _ in rows[step - 1::step]]

        # convert columns
        a = [[int(_[0])] + list(map(float, _[1:])) for _ in a]

        print(
            sum([_[1] for _ in a]),
            sum([_[2] for _ in a]),
            sum([_[3] for _ in a])
        )

请注意,我开始计算每个切片的 rowsnth 元素。换句话说,第一个 145 行实际上是 rows[144]。如果您真的想从 rows[145] 开始,请将 step - 1 替换为 step

这是另一种可能的解决方案,使用 pandas:

import pandas as pd

steps = (145, 154, 157)

df = pd.read_fwf('path.dat', header=None)

for step in steps:
    # select every 'step' rows
    a = df[step - 1::step]

    print(sum(a[1]), sum(a[2]), sum(a[3]))