Почему я получаю случайный элемент с difflib.ndiff?
Минимальный рабочий пример:
In [3]: a = ('r1', 'r2', 'r11', 'r6', 'r1', 'r2', 'r7', 'r8')
In [4]: b = ('r1', 'r2', 'r1', 'r6', 'r1', 'r2', 'r7', 'r8')
In [5]: list(difflib.ndiff(a, b))
Out[5]:
[' r1',
' r2',
'- r11',
'? -\n',
'+ r1',
' r6',
' r1',
' r2',
' r7',
' r8']
Может кто-нибудь объяснить, почему в строке вывода есть символ перевода строки? Что я могу сделать, чтобы не получить этот элемент как ndiff
вывод, а только остальная часть списка?
3 ответа
Из документации для difflib.Differ.compare
(который является то, что .ndiff()
звонки под капот), упор мой:
compare(a, b)
Сравните две последовательности строк и сгенерируйте дельту (последовательность строк).
Каждая последовательность должна содержать отдельные однострочные строки, оканчивающиеся символами новой строки. Такие последовательности можно получить из
readlines()
метод файловых объектов. Сгенерированная дельта также состоит из строк, завершающихся новой строкой, готовых к печати как есть черезwritelines()
метод файлового объекта.
Таким образом, строки, которые вы передаете, должны заканчиваться символами новой строки, например:
a = ('r1\n', 'r2\n', 'r11\n', 'r6\n', 'r1\n', 'r2\n', 'r7\n', 'r8\n')
b = ('r1\n', 'r2\n', 'r1\n', 'r6\n', 'r1\n', 'r2\n', 'r7\n', 'r8\n')
и вывод имеет смысл. Строки, начинающиеся с?
предназначены для выделения того, что изменилось. В этом случае он рисует-
под вторым 1
в r11
чтобы показать вам, что он был удален. difflib
ожидает, что вы будете использовать такой вывод
print(''.join(difflib.ndiff(a, b)))
поэтому ему нужно заканчивать любые добавляемые строки новой строкой.
Вы можете добавить новые строки к своим значениям с пониманием списка
a = [line + "\n" for line in a]
b = [line + "\n" for line in b]
Для тех, кто пытается выяснить точную проблему: вот что происходит:
Итак, ndiff пытается дать вам больше информации: вы можете преобразовать r11 в r1, удалив последний символ 1. Примечание: _ используется для копирования вывода предыдущей команды.
Из документации:
Строки начинающиеся с '?' попытаться направить взгляд на внутрипочвенные различия и не присутствовать ни в одной из входных последовательностей. Эти строки могут сбивать с толку, если последовательности содержат символы табуляции.
Это в основном искусственная разница. Кажется, что-то связано со сходством между r1
а также r11
; изменение элемента в a
в r7
избавляется от ?
разн. Я не уверен, что составляет "подобное", хотя.