Согласование среза массива - PullRequest
0 голосов
/ 30 января 2020

Я построил функцию, чтобы вырезать посторонний мусор из текстовых записей. Он использует слайсер массива. Теперь мне нужно согласовать строки, которые были удалены моей функцией очистки, так что все lines_lost + lines_kept = общее количество строк. Исходный код ниже:

def header_cleanup(entry_chunk):
    # Removes duplicate headers due to page-continuations
    entry_chunk = entry_chunk.replace("\r\n\r\n","\r\n")
    header = lines[1:5]
    lines[:] = [x for x in lines if not any(header == x for header in headers)]
    lines = headers + lines
    return("\n".join(lines))

Как подсчитать строки, которые не отображаются в строках после среза / мутации, например:

original_length = len(lines)
lines = lines.remove_garbage
garbage = lines.garbage_only_plz
if len(lines) + len(garbage) == original_length:
    print("Good!")
else:
    print("Bad!  ;(")

Окончательный ответ в итоге выглядел так :

def header_cleanup(entry_chunk):
    lines = entry_chunk.replace("\r\n\r\n","\r\n")
    line_length = len(lines)
    headers = lines[1:5]
    saved_lines = []
    bad_lines = []
    saved_lines[:] = [x for x in lines if not any(header == x for header in headers)]
    bad_lines[:] = [x for x in lines if any(header == x for header in headers)]
    total_lines = len(saved_lines) + len(bad_lines)
    if total_lines == line_length:
        print("Yay!")
    else:
        print("Boo.")
        print(f"{rando_trace_info}")
        sys.exit()
    final_lines = headers + saved_lines
    return("\n".join(final_lines))

Ококококок - я знаю, вы думаете: это излишне, но необходимо. Открыто для редактирования после решения для чего-нибудь еще pythoni c. Спасибо за внимание.

1 Ответ

0 голосов
/ 30 января 2020

Не используйте повторно переменную lines, используйте другую переменную, чтобы вы могли получить мусор из исходных строк.

clean_lines = remove_garbage(lines)
garbage = garbage_only(lines)
if len(clean_lines) + len(garbage) == len(lines):
    print("Good!")
else:
    print("Bad!")

Возможно, вы захотите иметь одну функцию, которая возвращает оба :

clean_lines, garbage = filter_garbage(lines)
...