<p>如果你以一种不鼓励回答者检查其结构的方式显示你的输入,并且你问诸如“我如何只提取浮点数”之类的问题,并在评论中隐藏有用的信息,比如“在我正在查看的每个文件中,每行都有6个类似的数字”,你会得到下意识的答案,准确地提供了你所要求的:一个“浮动”列表,<strong>在列表前面包括3个伪数字(1.0、21.0和1.0)</strong>。在</p>
<p>如果您以一种更合意的方式显示数据,例如:</p>
<pre><code>alist = [
'#', '3e98.mtz', 'MR_AUTO', 'with', 'model', '200la_.pdb', 'SPACegroup', 'HALL', 'P', '2yb',
'#P', '1', '21', '1',
'SOLU', 'SET', 'RFZ=3.0', 'TFZ=4.7', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_',
'EULER', '321.997', '124.066', '234.744', 'FRAC', '-0.14681', '0.50245', '-0.05722',
'SOLU', 'SET', 'RFZ=3.3', 'TFZ=4.2', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_',
'EULER', '329.492', '34.325', '209.775', 'FRAC', '0.70297', '0.00106', '-0.24023',
'SOLU', 'SET', 'RFZ=3.6', 'TFZ=3.6', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_',
'EULER', '177.344', '78.287', '187.356', 'FRAC', '0.04890', '0.00090', '-0.57497'
]
</code></pre>
<p>人们有可能会注意到这种结构(EULER后跟三个数字,然后是FRAC,然后是三个数字)重复,然后说“Oho,他的文件中每行有六个数字”,然后回来时会给出一些更有用的建议,比如:</p>
<p>从头开始,告诉我们你的文件结构是什么。可能有一种更好的获取信息的方法,而不是将文件粉碎成一个字符串列表,然后尝试从中恢复。在</p>
<p><strong>更新</strong>同时,这里有一个答案,它使用了在您的数据和注释中很明显的结构,如果结构中有变化,它将更易于调试:</p>
^{pr2}$
<p>结果:</p>
<pre><code>0 TAG0 (321.99700000000001, 124.066, 234.744)
0 TAG1 (-0.14681, 0.50244999999999995, -0.05722)
1 TAG0 (329.49200000000002, 34.325000000000003, 209.77500000000001)
1 TAG1 (0.70296999999999998, 0.00106, -0.24023)
2 TAG0 (177.34399999999999, 78.287000000000006, 187.35599999999999)
2 TAG1 (0.048899999999999999, 0.00089999999999999998, -0.57496999999999998)
</code></pre>
<p><strong>更新2</strong>根据您的示例文件,以下简单代码(未测试)应该可以满足您的需要:</p>
<pre><code>for line in open('my_file.txt'):
row = line.split()
if row[0] == 'SOLU' and row[1] == '6DIM' and row[4] == 'EULER' and row[8] == 'FRAC':
euler = map(float, row[5:8])
frac = map(float, row[9:12])
do_something_with(euler, frac)
</code></pre>
<p>注意:这只是一个巧合,你要找的是“所有的浮点数”(它忽略了<code>RFZ=3.0 TFZ=4.7</code>中的浮点数!)。你得到的是一个有结构的文件:两种类型的SOLU记录,你想要在solu6dim记录中出现在EULER之后的3个数字和FRAC之后的3个数字。你不需要所有这些数字的列表,必须再次将它们分成(3个欧拉数和3个压裂数)乘以N</p>