#python
#python
Вопрос:
У меня есть два входных файла:
авиакомпания scandinavian t airline авиакомпания
один n 0 номер
рейса шесть n 0 номер рейса
два n 0 номер рейса
три n 0 номер рейса
speedbird t авиакомпания авиакомпания
один n 0 номер
рейса шесть n 0 номер рейса
восемь n 0 номер рейса
Мой второй входной файл:
скандинавская авиакомпания t
airli один n 0 номер
рейса шесть n 0 номер рейса
два n 0 номер рейса
три n 0 номер рейса
шесть n 0 flightnumber
восемь n 0 flightnumber
У меня есть следующий код:
with open('output_ref.txt', 'r') as file1:
with open('output_ref1.txt', 'r') as file2:
same = set(file1).difference(file2)
print same
print "n"
same.discard('n')
with open('some_output_file.txt', 'w') as FO:
for line in same:
FO.write(line)
И я получаю вывод в виде:
скандинавская авиакомпания t airline авиакомпания
speedbird авиакомпания t airline авиакомпания
Но мой фактический результат должен быть:
скандинавская авиакомпания t авиакомпания
speedbird t авиакомпания авиакомпания
один n 0 номер рейса
Может кто-нибудь помочь мне в решении проблемы??
Комментарии:
1. Набор уникален. Таким образом, у вас есть только одна строка «one n 0 flightnumber» после выполнения ‘set (file1)’. Может быть, вы предпочли бы список?
2. В Python есть встроенный difflib (в стороне, поскольку он не отвечает на заданный вопрос).
Ответ №1:
Прежде всего, если то, что вы пытаетесь сделать, это получить общие строки из файла 2 (что предполагает «одинаковое» имя переменной), тогда вам следует использовать метод пересечения вместо difference . Кроме того, оба этих метода, как утверждается, требуют наборов в качестве своих аргументов, поэтому я бы сделал дополнительный шаг и тоже превратил второй файл в набор . Итак, новый код должен быть:
first = set(file1)
second = set(file2)
same = first.intersection(second)
…..
Редактировать :
чтение некоторых комментариев к моему сообщению убедило меня, что вы действительно хотите разницу, и не в наборах, а в списках. Я думаю, это должно сработать для вас :
difference = list(file1)
second = list(file2)
for line in second:
try:
first.remove(line)
except ValueError,e:
print e # alternately you could just pass here
Комментарии:
1. Нет, это не решение его проблемы. Как говорит @cyrille-pontvieux, это не удается, потому что set устраняет дубликаты и
one n 0 flightnumber
появляется в обоих объектах set.2. авиакомпания speedbird t airline присутствует только в первом файле. Кроме того, если то, что он хочет, не является общими строками, тогда, я думаю, называть переменную «same» действительно плохой идеей
3. конечно, я согласен с вами в том, что присвоение
same
имени переменной сбивает с толку, но, исходя из его ожидаемого результата и его кода, я предполагаю, что он хочет получить различия
Ответ №2:
def diff(a, b):
y = []
for x in a:
if x not in b:
y.append(x)
else:
b.remove(x)
return y
with open('output_ref.txt', 'r') as file1:
with open('output_ref1.txt', 'r') as file2:
same = diff(list(file1), list(file2))
print same
print "n"
if 'n' in same:
same.remove('n')
with open('some_output_file.txt', 'w') as FO:
for line in same:
FO.write(line)
$ python compare.py
['scandinavian t airline airlinen', 'speedbird t airline airlinen', 'one n 0 flightnumbern']
$ cat some_output_file.txt
scandinavian t airline airline
speedbird t airline airline
one n 0 flightnumber
Комментарии:
1. Добро пожаловать 🙂 Интересно, почему кто-то отказался от ответа после того, как был принят op.