Python начинает с функции: печать не частично совпадающих строк

Здравствуйте, я хочу использовать функцию startswith распечатать строки в fileY.txt, которые НЕ частично совпадают со строками в fileX.txt

В приведенном ниже сценарии я использую fileX.txt и fileY.txt в качестве списков. Затем я ищу fileX.txt для частичного совпадения с fileY.txt, используя начинается с функции.

Затем я пытаюсь напечатать строки, которые НЕ частично совпадают между fileX.txt и fileY.txt. Однако скрипт печатает только последнюю строку в fileY.txt

Любая помощь и предложения будут оценены (я не возражаю, если мне придется использовать вспомогательное приложение, например, sed)

Источник:

#load lines from file into lists
lines1 = [line1.rstrip('\n') for line1 in open('fileX.txt')]
lines2 = [line2.rstrip('\n') for line2 in open('fileY.txt')]

#set lines
set_of_lines1 = set(lines1)
set_of_lines2 = set(lines2)

#set common
common = set_of_lines1 & set_of_lines2

#return lines which partially match as variable e
[e for e in lines1 if e.startswith(tuple(lines2))]

#minus partially matched lines from fileY.txt
difference = set_of_lines2 - e

#print the non matching lines
for color in difference:
   print 'The color prefix ' + color + ' does not exist in the list'

файлX.txt:

blue
green
red

файл Y.txt:

blu
gre
re
whi
oran

Что я хочу:

C:\Users\Foo\Bar\Python\Test\>C:\python27\python Test.py
The color prefix whi does not exist in the list
The color prefix oran does not exist in the list

Press any key to continue . . .

person MALKAVIAN    schedule 08.02.2018    source источник


Ответы (1)


Первая проблема связана с этой строкой:

[e for e in lines1 if e.startswith(tuple(lines2))]

Он создает список частичных совпадений, и затем отбрасывает его. Все, что вы сохраняете, - это значение e, которое просочилось из понимания списка (и в Python 3 выдаст вам ошибку неопределенного значения). Тебе нужно:

partial_match = [e for e in lines1 if e.startswith(tuple(lines2))]

что подводит нас ко второй проблеме. Если вы распечатаете partial_match, вы увидите, что оно содержит ['blue', 'green', 'red'], и я думаю, вы ожидаете, что оно будет содержать ['blu', 'gre', 're'], потому что вы пытаетесь установить разницу между ним и set(['blu', 're', 'gre', 'whi', 'oran']).

Поскольку ваши проблемы связаны с пониманием списка, я предлагаю вам развернуть его в цикл, где вы можете распечатать промежуточные значения, чтобы вы могли видеть, что происходит, и правильно понимать логику. Если вам действительно нужен однострочник, вы всегда можете переписать его позже.

Как это:

matches = []
for prefix in lines2:
    for colour in lines1:
        if colour.startswith(prefix):
            matches.append(prefix)

matches теперь будет содержать ['blu', 'gre', 're']. Теперь сообщите о префиксах, которые не совпадают.

for nomatch in set(lines2) - set(matches):
    print "The color prefix %r does not exist in the list" % nomatch

Это даст вам вывод:

The color prefix 'whi' does not exist in the list
The color prefix 'oran' does not exist in the list
person BoarGules    schedule 08.02.2018
comment
Спасибо за объяснение, оно помогает мне понять общую логику. - person MALKAVIAN; 08.02.2018
comment
Фундаментальной проблемой, с которой вы столкнулись, был этот умный фрагмент кода: e.startswith(tuple(lines2). Это сообщает вам, если что-то в lines1 совпало, но не сообщает вам, какой префикс совпал, а только один из них. Что было бы хорошо, если бы не тот факт, что вы повторно интересует, какой префикс соответствует. - person BoarGules; 11.02.2018