从二维列表中提取值以对其进行操作
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])
)
请注意,我开始计算每个切片的 rows
的 nth
元素。换句话说,第一个 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]))
我正在尝试从二维列表中提取值,以保存它们并对其执行操作,原则上我从 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])
)
请注意,我开始计算每个切片的 rows
的 nth
元素。换句话说,第一个 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]))