Как найти шаблон чисел в последовательных строках с Python? - PullRequest
2 голосов
/ 22 марта 2019

Я изучаю Python, но у меня есть некоторые проблемы с моими скриптами.

У меня есть файл, похожий на:

1 5
2 5
3 5
4 2
5 1
6 7
7 7
8 8

Я хочу напечатать пары чисел 2-1 в последовательных строках, просто взять столбец 2, чтобы найти их, а затем распечатать столбец 1 и 2 с результатами. Результат будет похож на это:

4 2 
5 1 

Я пытаюсь сделать это с помощью Python, потому что мой файл содержит 4 000 000 данных. Итак, это мой сценарий:

import linecache

final_lines = []
with open("file.dat") as f:
for i, line in enumerate(f, 1):
    if "1" in line:
        if "2" in linecache.getline("file.dat", i-1):
            linestart = i - 1 
            final_lines.append(linecache.getline("file.dat", linestart))
print(final_lines)

и результат:

['2\n', '2\n', '2\n']

Что я должен изменить в своем сценарии, чтобы он соответствовал желаемому результату? Большое спасибо.

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Используйте цикл for с enumerate с оператором if для подготовки строк, а затем, если условие истинно, добавьте две строки в список final_lines:

final_lines = []
with open('file.dat') as f:
    lines = f.readlines()
    for i,line in enumerate(lines):
        if line.split()[1] == '2' and lines[i+1].split()[1] == '1':
            final_lines.extend([line,lines[i+1]])

А теперь:

print(final_lines)

вернет вам нужный список.

0 голосов
/ 24 марта 2019

Вы новичок в Python, и это здорово, поэтому я собираюсь использовать более элементарный подход.Это огромный файл, так что вы лучше читаете строку за раз и сохраняете только эту строку, но вам на самом деле нужны две строки для идентификации шаблона, поэтому оставьте две.рассмотрим следующее:

    fp = open('file.dat')
    last_line = fp.readline()
    next_line = fp.readline()
    while next_line:
        # logic to split the lines into a pair 
        # of numbers and check to see if the 
        # 2 and 1 end last_line and next_line
        # and outputting
        last_line = next_line
        next_line = fp.readline()

Это соответствует хорошим, читаемым программным шаблонам и требует минимум ресурсов.

0 голосов
/ 22 марта 2019

будет работать, я думаю

import re
with open("info.dat") as f:
   for match in re.findall("\d+ 2[\s\n]*\d+ 1",f.read()):
       print match

см. Также: https://repl.it/repls/TatteredViciousResources

другой альтернативой является

lines = f.readlines()
for line,nextline in zip(lines,lines[1:]):
    if line.strip().endswith("2") and nextline.strip().endswith("1"):
       print(line+nextline)
...