Определение того, где запись столбца первой изменяет знак и сохраняет строку ввода в файл

#python

#python

Вопрос:

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


-1 2 3
-3 3 5
-1 4 9
-3 5 6
-2 7 7
1 3 5
2 4 5
-2 4 5
1 5 6

Код должен сохранить строку -2 7 7 в другой файл. Это должно быть просто, но я не могу этого сделать

Комментарии:

1. Пожалуйста, уточните, хотите ли вы только первое изменение знака или каждое изменение знака.

Ответ №1:

Вы можете использовать zip () для обработки элементов в списке с их преемником:

 lines = [ [-1, 2, 3],
          [-3, 3, 5],
          [-1, 4, 9],
          [-3, 5, 6],
          [-2, 7, 7],
          [1,  3, 5],
          [2,  4, 5],
          [-2, 4, 5],
          [1,  5, 6]
        ]

col = 0
keepLine = [ a for a,b in zip(lines,lines[1:]) if a[col]*b[col]<0 ]
print(keepLine) # [[-2, 7, 7], [2, 4, 5], [-2, 4, 5]]


# iterative ...
col = 0
previousLine = None
for line in lines:  # or [int(n.strip()) for n in file.readline().split(",")]
    if previousLine and line[col]*previousLine[col] < 0:
        print(previousLine)
    previousLine = line 
  

Комментарии:

1. Входные данные поступают из файла, и поэтому потребуется итеративный подход. Не уверен, что инициализация, показанная для lines , полезна.

2. Насколько велик ваш файл? Это не должно было бы быть достаточно большим, чтобы оно не помещалось в памяти. Я добавлю итеративный пример…

3. Неподходящая память была не тем, на что я указывал. Но что касается итеративного, да, это правильно.

4. Вы имели в виду, что вам нужна помощь в чтении / записи в файлы?

5. Нет. Обратите внимание, я не OP. Я просто говорил, что ваш пример статичен, и для новичка, который ссылается на ваш ответ, это решит этот один пример, но он не предлагает подход, который следует использовать. Так что даже просто обратите внимание, что это то, что нужно сделать (чтение строк и синтаксический анализ), это нормально.

Ответ №2:

Итак, я оставлю часть чтения из файла (для которого есть много примеров здесь или в другом месте) для вас.

Как только вы это сделаете, у вас будет список строк. На этом этапе вам следует использовать подход с двумя указателями или просто четный индекс. Обратите внимание, что эти строки будут строковыми представлениями числовых записей. Таким образом, вы могли бы использовать регулярные выражения, чтобы увидеть, начинается ли строка со знака - или или без знака (указывающего на положительное значение). Или приведение к типу, или используйте помощник, чтобы упростить управление.

 def get_sign(line):
    sign = line.split()[0] #This will be a list of strings like ['-1', '3', '3'] or ['2', '4', '7']
    if int(sign) < 0: #That's why the need to cast to compare.
        return -1
    return 1

#in your program, after parsing the file and loading up the lines as a list of strings
curr_sign = get_sign(lines[0]) #This will either be -,  
for ind in range(len(lines)-1): #lines is from getting all the lines from the file
    if curr_sign != get_sign(lines[ind 1]):
        write_to_file(lines[ind])
        break #if you only need the first sign change.
  

Если вы хотите, чтобы все изменения знака отслеживались аналогичным образом

 #in your program, after parsing the file and loading up the lines as a list of strings
curr_sign = get_sign(lines[0]) #This will either be -,  
for ind in range(len(lines)-1): #lines is from getting all the lines from the file
    if curr_sign != get_sign(lines[ind 1]):
        write_to_file(lines[ind]) #You're writing the prev line to when the sign changed
        if curr_sign < 0:
            curr_sign = 1
        else:
            curr_sign = -1