Невозможно получить установленное пересечение для работы - PullRequest
0 голосов
/ 03 марта 2010

Извините за двойной пост, я обновлю этот вопрос, если я не могу заставить вещи работать:)

Я пытаюсь сравнить два файла. Я перечислю два содержимого файла:

 File 1                           File 2

"d.complex.1"                     "d.complex.1"

  1                                 4
  5                                 5
  48                                47
  65                                21

d.complex.10                    d.complex.10

  46                                6
  21                                46
 109                               121
 192                               192

Я пытаюсь сравнить содержимое двух файлов, но не тривиальным способом. Я объясню, что я хочу на примере. Если вы наблюдаете содержимое файла, которое я набрал выше, d.complex.1 для file_1 имеет «5», аналогично d.complex.1 в file_2; тот же d.complex.1 в file_1 не имеет ничего похожего на d.complex.10 в file_2. То, что я пытаюсь сделать, это просто распечатать эти d.complex. который не имеет ничего общего с другим d.complex. Рассмотрим d.complex. как заголовок, если хотите. Но все, что я пытаюсь, это сравнить цифры ниже каждого d.complex и если ничего не подходит, я хочу этот конкретный d.complex. из обоих файлов для печати. Если хотя бы один номер присутствует в обоих d.complex. я хочу, чтобы он был отклонен.

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

first_complex=open( "file1.txt", "r" )
first_complex_lines=first_complex.readlines()
first_complex_lines=map( string.strip, first_complex_lines )
first_complex.close()

second_complex=open( "file2.txt", "r" )
second_complex_lines=second_complex.readlines()
second_complex_lines=map( string.strip, second_complex_lines )
second_complex.close()


list_1=[]
list_2=[]

res_1=[]
for line in first_complex_lines:
    if line.startswith( "d.complex" ):
        res_1.append( [] )
    res_1[-1].append( line )

res_2=[]
for line in second_complex_lines:
    if line.startswith( "d.complex" ):
        res_2.append( [] )
    res_2[-1].append( line )
h=len( res_1 )
k=len( res_2 )
for i in res_1:
   for j in res_2:
       print i[0]
       print j[0]
       target_set=set ( i )
       target_set_1=set( j )
       for s in target_set:
           if s not in target_set_1:
               if s[0] != "d":
                   print s

Приведенный выше код дает вывод, подобный этому (просто пример): d.complex.1.dssp d.complex.1.dssp 1 48 65

d.complex.1.dssp
d.complex.10.dssp    
46
21

109

Я хотел бы иметь:

d.complex.1
d.complex.1 (name from file2)

d.complex.1
d.complex.10 (name from file2)

Прошу прощения за смущение, ребята, но это все, что требуется.

Я так новичок в python, поэтому моя концепция выше может быть ошибочной. Также я никогда раньше не пользовался сетами :(. Кто-нибудь может мне здесь помочь?

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Проблема в том, что вы используете пересечение вместо разницы:)

Если вы используете target_set.difference(target_set_1), у вас будут результаты, которые вы ищете.

Я не уверен, полностью ли я получаю то, что вы хотите, но это то, что вы ищете?

def complex_file_to_dict(filename):
    out = dict()
    for line in open(filename):
        line = line.strip()
        if line.startswith('d.complex'):
            name = line
            out[name] = set()
        elif line:
            out[name].add(line)

    return out

res_1 = complex_file_to_dict('a.txt')
res_2 = complex_file_to_dict('b.txt')

for k, set_1 in res_1.iteritems():
    print k
    set_2 = res_2.get(k, set())
    for v in set_1 - set_2:
        print v
    print
1 голос
/ 03 марта 2010

Вам нужно использовать разницу вместо пересечение , так как последний даст вам предметы, которые находятся в обоих наборах. Вы также можете использовать синтаксис set1 - set2. См. Документы по питону для наборов .

Я думаю, что вы после этого (спасибо Рик за оригинальный код):

def complex_file_to_dict(filename):
    out = dict()
    for line in open(filename):
        line = line.strip()
        if line.startswith('d.complex'):
            name = line
            out[name] = set()
        elif line:
            out[name].add(line)

    return out

res_1 = complex_file_to_dict('file1.txt')
res_2 = complex_file_to_dict('file2.txt')

for k1, set_1 in res_1.iteritems():
    for k2, set_2 in res_2.iteritems():
      print k1
      print k2
      for v in set_1 - set_2:
        print v
      print

EDIT: Вы можете изменить цикл следующим образом:

for k1, set_1 in res_1.iteritems():
    for k2, set_2 in res_2.iteritems():
      print k1
      print k2,
      l = [v for v in set_1 - set_2]
      print '(' + ', '.join(l) + ')'

чтобы получить вывод, подобный этому:

d.complex.1
d.complex.1 (1, 65, 48)
d.complex.1
d.complex.10 (1, 65, 48)
d.complex.10
d.complex.1 (46, 109, 192)
d.complex.10
d.complex.10 (109, 21)
...