我无法正确使用枚举功能

时间:2013-11-20 14:13:12

标签: python svm enumerate

我写了一个代码来枚举char" a"从文本文件(从pdf复制的简单文本文档):

input_f = open('/home/zebrafish/Desktop/stackq/doc.txt','r')

#text i used in "doc.txt file"
#
#unctional similarities between the ATP binding pockets of
#kinases or between chemotypes of inhibitors that cannot
#be predicted from the sequence of the kinase or the
#chemical structure of the inhibitor.
#We first compared PI3-K family members according to

output_f = open('/home/zebrafish/Desktop/stackq/svm_in.txt','w')


for line in input_f :
    a = line
    print "\n",
    for y in enumerate([x[0] for x in enumerate(line) if x[1]=='a']): 
        a = ("%d:%d" % (y[0]+1,y[1]+1))
        #print a,
        output_f.write(a+" ")        

input_f.close()
output_f.close()

如果我按照我的要求运行此脚本而不生成输出文件,则此代码的输出如下所示,对于每一行,它计算" a"的位置。与频率一样,如第一行" a"首先在第8位出现两次,在第16位出现第二次,因此列举为" 1:8 2:16"每一行都有一个:

1:8 2:16 
1:4 2:47 3:51 
1:42 
1:7 
1:14 2:26 3:40 

但是当我在文本文件中写下输出时," svm_in.txt"用" output_f.write()"输出非常有线。 这样的事情:

1:8 2:16 1:4 2:47 3:51 1:42 1:7 1:14 2:26 3:40 

如何使用" +"为每行输出结果?像这样在行的开头正弦:

+ 1:8 2:16 
+ 1:4 2:47 3:51 
+ 1:42 
+ 1:7 
+ 1:14 2:26 3:40 

2 个答案:

答案 0 :(得分:3)

请勿打印换行符,而是将其写入文件:

for line in input_f :
    output_f.write("\n+ ")
    for y in enumerate([x[0] for x in enumerate(line) if x[1]=='a']): 
        a = ("%d:%d" % (y[0]+1,y[1]+1))
        output_f.write(a + " ")        

你可以使用一些元组解压缩使你更清楚你所枚举的内容,你可以放弃[..]列表理解并使用生成器表达式(节省一些内存和处理):

for i, pos in enumerate((pos for pos, char in enumerate(line, 1) if char == 'a'), 1):
    output_f.write('%d:%d ' % (i, pos))

我还为enumerate()函数提供了第二个参数,即起始值,因此您不必每个数字+ 1,并在字符串格式中添加文件输出中的空格。 / p>

你通常会在写一行之后写新行;如果你想要每行一个计数器,添加另一个枚举::

for count, line in enumerate(input_f, 1):
    output_f.write("%d+ " % count)
    for i, pos in enumerate((pos for pos, char in enumerate(line, 1) if char == 'a'), 1):
        output_f.write('%d:%d ' % (i, pos))
    output_f.write('\n')

或者,通过使用str.join(),您可以一次创建整行,使用格式在一个格式化操作中包含前缀和换行符:

for count, line in enumerate(input_f, 1):
    positions = (pos for pos, char in enumerate(line, 1) if char == 'a')
    line = ' '.join(['%d:%d' % (i, pos) for i, pos in enumerate(positions, 1)])
    output_f.write("%d+ %s\n" % (count, line))

整齐地避免了尾随空间。

答案 1 :(得分:1)

我会这样做:

for line in input_f:

    # find the positions of As in the line
    positions = [n for n, letter in enumerate(line, 1) if letter == 'a']

    # Create list of strings of the form "x:y"
    pairs = [("%d:%d" % (i, n)) for i, n in enumerate(positions, 1)]

    # Join all those strings into a single space-separated string
    all_pairs = ' '.join(pairs)

    # Write the string to the file, with a + sign at the beginning
    # and a newline at the end
    output_f.write("+ %s\n" % all_pairs)

您可以修改最后一行中的字符串,以控制在输出文件中写入行的方式。