无法设置交叉点工作

时间:2010-03-03 13:05:30

标签: python compare set loops

对于双重帖子感到抱歉,如果我无法解决问题,我会更新此问题:)

我正在尝试比较两个文件。我将列出两个文件内容:

 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

TI正在尝试比较两个文件的内容,但不是以微不足道的方式。我将通过一个例子来解释我想要的东西。如果您观察到我上面输入的文件内容,则file_1的d.complex.1与file_2中的d.complex.1类似“5”; file_1中的d.complex.1与file_2中的d.complex.10没有任何相似之处。我想要做的就是打印出那些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 个答案:

答案 0 :(得分:2)

问题在于你使用的是十字路口而不是差异:)

如果您使用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 :(得分:1)

您需要使用差异而不是交集,因为后者会为您提供两个集合中的项目。您还可以使用set1 - set2语法。 See the python docs for sets

我认为你是在这之后(感谢原始代码的Rick):

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

编辑: 您可以将循环更改为:

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)