Если вы выводите свои данные таким образом, который не дает ответчикам возможности проверить их структуру, и вы задаете вопросы, такие как «как извлечь только числа с плавающей запятой», и хороните полезную информацию, например «В каждом файле, который я просматриваю» в каждой строке 6 цифр "в комментариях вы получите ответы коленного рефлекса, в которых содержится именно то, что вы просили: список" поплавков ", который включает 3 ложных числа (1.0, 21.0 и 1.0) в начале списка.
Если вы отображаете ваши данные более подходящим образом, например:
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'
]
есть некоторый шанс, что люди заметят, что структура (EULER, за которой следуют три числа, затем FRAC, за которой следуют три числа), повторяется и идет «Ох, шесть чисел в строке в его файле» и возвращается с еще более полезными советами, такими как :
Начните с самого начала, расскажите нам, какова ваша файловая структура. Вероятно, есть лучший способ получить информацию, чем разбить файл на список строк, а затем попытаться восстановить его.
Обновление А пока вот ответ, который использует структуру, которая очевидна в ваших данных и комментариях и будет более отлаживаемой, если в структуре есть различия:
TAG0 = 'EULER'
TAG1 = 'FRAC'
def extract_rows(tokens):
pos = 0
while True:
try:
pos = tokens.index(TAG0, pos)
except ValueError:
return
assert pos + 8 <= len(tokens)
assert tokens[pos+4] == TAG1
yield (
tuple(map(float, tokens[pos+1:pos+4])),
tuple(map(float, tokens[pos+5:pos+8])),
)
pos += 8
for rowx, row in enumerate (extract_rows(alist)):
print rowx, 'TAG0', row[0]
print rowx, 'TAG1', row[1]
Результаты:
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)
Обновление 2 Исходя из вашего файла примера, следующий простой код (непроверенный) должен делать то, что вы хотите:
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)
Примечание: это просто совпадение, что вы ищете "все числа с плавающей запятой" (которые в любом случае игнорируют числа с плавающей запятой в RFZ=3.0 TFZ=4.7
!). У вас есть файл со STRUCTURE: два типа записей SOLU, и вы хотите, чтобы в записях SOLU 6DIM были 3 цифры после EULER и 3 после FRAC. Вам НЕ нужен список всех этих чисел, и вам нужно снова разделить их на (3 номера EULER и 3 номера FRAC) раз N.