программа для сравнения в питоне - PullRequest
3 голосов
/ 20 июля 2011

Я действительно новичок в программировании (действительно, действительно новый) и мне нужна помощь с основами. Я пытаюсь написать программу на python, которая будет сравнивать содержимое двух файлов .txt, один из которых является ссылкой, а другой - источником. Содержимое представляет собой простой случайный список имен, и я хочу, чтобы он распечатывался, если в источнике есть имена, которых нет в справочнике.

Я смотрел другие материалы на этом сайте, но каждый раз, когда я пробовал это делать, терминал никогда не давал результата, даже если в программе была команда печати.

Мне также трудно читать язык программы и выяснять ее точную функцию, поэтому что-то с четкими указаниями было бы очень полезно.

Насколько я знаю:

ref = open("reference.txt")
sor = open("source.txt")

list1 = ref.read()
list2 = sor.read()

for i in list2:
    if i != list:
    print i

ref.close()
sor.close()

И когда я пытаюсь запустить это, он говорит "ожидал блок с отступом"? в строке «печать я». Зачем?

Пожалуйста, помогите мне, потому что я должен учить себя этому, и у меня не очень хорошо получается.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 20 июля 2011

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

http://docs.python.org/tutorial/

1 голос
/ 20 июля 2011

Как упоминалось ранее, ваш внутренний оператор if должен иметь отступ, как

for i in list2:
    if i != list:
        print i

Для этого требуется два отступа, потому что это два вложенных блока.Как правило, везде, где вы заканчиваете строку двоеточием (:), вы начинаете новый блок кода и должны иметь отступ на другом уровне.Это означает, что вы можете сделать отступ один раз, чтобы завершить блок if, не заканчивая блок for.

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

sourceLines = set(sor.readLines())
for line in ref.readlines():
    if line not in sourcelines:
        print line
0 голосов
/ 20 июля 2011

Эти строки читают файлы как строки:

list1 = ref.read()
list2 = sor.read()

Этот цикл повторяет строку по одному символу за раз:

for i in list2:

Эта строка сравнивает символ с классом list:

    if i != list:
0 голосов
/ 20 июля 2011

Сначала я отвечу на вашу ошибку отступа: вам нужно еще 4 пробела перед оператором печати. В Python отступ имеет важное значение, и для завершения этого блока необходимо сделать отступ для любого блока и отступа.

Для вашей проблемы я не собираюсь давать вам заранее написанный код, а расскажу о том, как это сделать:

  1. Создать 2 комплекта (http://docs.python.org/library/stdtypes.html#set-types-set-frozenset)
  2. Считайте оба файла в отдельный набор (вы можете сделать это, перебирая файл и добавляя его в свой набор).
  3. Сравните ваши два набора, используя синтаксис set1 - set2 (см. Ссылку выше), чтобы показать все элементы, не общие для обоих наборов.

Надеюсь, вы сможете заставить это работать.

Теперь для кода:

with open('file1.txt') as file1:
    set1 = set(line for line in file1)

with open('file2.txt') as file2:
    set2 = set(line for line in file2)

print set1 - set2

При этом используются некоторые принципы, с которыми вы, вероятно, не знакомы (посмотрите: списки, генераторы и ранее отмеченная ссылка о наборах, которые являются уникальными коллекциями).

0 голосов
/ 20 июля 2011

if блоки в python должны иметь отступ, добавьте еще один уровень отступа для вашего print i оператора

for i in list2:
    if i != list:
        print i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...