Извлечение значений из двумерного списка для работы с ними - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь извлечь значения из двумерного списка, сохранить их и выполнить операции с ними, в принципе я получаю значения из 3 строк 145, 154 и 157, но проблема в том, что мне нужно go через весь список значений и извлеките следующие 3 строки, то есть одну строку каждые 145 строк, другую строку каждые 154 строки и еще одну строку каждые 157 строк, так что пока вы не закончите sh, читая весь список.

Образец 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')

Я прочитал файл и go в список списков:

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 с 60000 строками и сохраняю его в двумерном списке. Чтобы извлечь нужные мне значения, я попробовал следующее:

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

Здесь я передаю строку в тип с плавающей запятой, чтобы иметь возможность работать с ними:

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 строки и так далее, пока я не прочту весь список.

1 Ответ

0 голосов
/ 07 февраля 2020

Ваш вопрос не совсем ясен, но если вы правильно поняли, я думаю, что это достигнет вашей цели:

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])
        )

Обратите внимание, что я начинаю рассчитывать на элемент nth в rows для каждый кусочек. Другими словами, первая строка 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]))
...